使用UDP协议传输大数据

时间:2015-05-10 21:37:29

标签: java network-programming udp

我知道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);
}

提前谢谢。

1 个答案:

答案 0 :(得分:1)

几个问题:

  • 以下内容不正确:

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

    最后一行应该是

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

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

  • 删除sock.isConnected()测试。 DatagramSockets通常没有联系,你肯定没有连接这个。

  • 嵌入此循环的循环没有任何用处。您只发送&#34;完成&#34;。