【问题标题】:Transferring Large Data with UDP protocol使用 UDP 协议传输大数据
【发布时间】:2015-05-10 21:37:28
【问题描述】:

我知道 TCP 发送文件更好,但我有一个关于通过 udp 协议发送文件的作业。 C# 或 Java 中是否有关于发送文件的代码示例?

我有服务器-客户端示例来发送和接收消息。我尝试使用相同的方式发送文件,但未能成功。我可能需要一种算法来划分文件小部分并通过数据报发送它们,我有一个想法将部分的“md5”作为数组的标题来检查数据包是否丢失。

这是我的尝试,我在 java 中的服务器端;

// 1. creating a server socket, parameter is local port number
sock = new DatagramSocket(7777);

// buffer to receive incoming data
byte[] buffer = new byte[65536];
DatagramPacket incoming = new DatagramPacket(buffer, buffer.length);
byte []bigByteArray=new byte[1024*1024*1024*1024];
// 2. Wait for an incoming data
echo("Server socket created. Waiting for incoming data...");
ByteBuffer target = ByteBuffer.wrap(bigByteArray);
// communication loop

while(true)
{
  try
  {
    sock.receive(incoming);
    String s = new String(incoming.getData());
    if(s=="finish") break;
    target.put(incoming.getData());
  }
  catch(Exception e)
  {

  } 
}
fos.write(bigByteArray);
fos.close();echo("RECIEVED");

还有我的客户端;

String s;
Path path=Paths.get("C:\\Users\\Toshiba\\Desktop\\aa.txt");
byte[] data = Files.readAllBytes(path);


try
{
  sock = new DatagramSocket();

  InetAddress host = InetAddress.getByName("localhost");

  //take input and send the packet

  byte [] part;
  for (int i = -1; i < data.length; i=i+100) 
  {
    if(sock.isConnected())
    {
      part=Arrays.copyOfRange(data,i+1,i+100 );
    }
    else i=i-100;
  }   
  byte [] f="finish".getBytes();
  DatagramPacket finalpac = new DatagramPacket(f ,f.length , host , port);

  sock.send(finalpac);
}

提前谢谢你。

【问题讨论】:

  • 'Could not succeed' 不是问题描述。
  • 我很抱歉我的错误短语,我在尝试此代码时没有遇到编译器错误,但我也没有得到任何输入。我刚刚写了我试图通过 UDP 发送文件的方法。

标签: java network-programming udp


【解决方案1】:

几个问题:

  • 以下不正确:

    sock.receive(incoming);
    String s = new String(incoming.getData());
    

    最后一行应该是

    String s = new String(incoming.getData(), incoming.getOffset(), incoming.getLength());
    

    如果您没有收到文本,则根本不应该将数据转换为 String

  • 删除sock.isConnected() 测试。 DatagramSockets一般是不连接的,你肯定没连接这个。

  • 嵌入它的循环没有任何用处。你只是发送“完成”这个词。

【讨论】:

  • 那么在我修复了错误的部分之后,我发送文件的方式是正确的吗? ,或者您是否建议通过 UDP 发送文件的另一种方式?由于 UDP 不适合发送文件,我找不到很多关于它的来源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多