2013-04-29 48 views
1

我有一个冗长的文本文件,我试图通过本地主机上的UDP进行传输,所以很自然地,我必须打破字节缓冲区来发送数据包中的文件。数据包的getOffset()在接收端返回0

我遇到的问题是这样的:

在服务器端,我发送一个数据包与偏移量设定为500说字节缓冲区:

 byte[] buf = text.getBytes(); 
     InetAddress address = InetAddress.getByName("localhost"); 

     DatagramPacket packet = new DatagramPacket(buf, 500, BYTES_PER_PACKET, address, udp_port_num); 

     System.out.println("Offset at server: " + packet.getOffset()); 
     udpSocket.send(packet); 

print语句返回的500

预期的答案,但随后在客户端:

   byte[] buf = new byte[BYTES_PER_PACKET];      
       DatagramPacket packet = new DatagramPacket(buf, BYTES_PER_PACKET); 

       udpSocket.receive(packet); 

       String received = new String(packet.getData()); 

       System.out.println(received); 
       System.out.println("Offset: " + packet.getOffset()); 

它从接收到的文件的偏移量打印正确的文本,但是packet.getOffset()总是返回0.为什么它不是从服务器返回相同的500和/或我怎样才能让它返回相同的500从服务器?

在此先感谢

回答

0

偏移量是您可以阅读或写作的地方。当写入500个字节时,偏移量为500个字节,但是当您读取时您处于偏移量0,因为您尚未读取任何内容。

该方法的一些问题是:

a)UDP不是可靠的传输方式,因此数据包可以以任意顺序丢弃或到达。 b)随机剪切一个文本文件可以将一个多字节字符分成两半,这使得难以重新组装这种方式。例如第一个字节可能在一个数据包的末尾,然后在下一个数据包完成。注意:如果你要发送更大的数据块,它们也可能被分解,并以多个数据包或部分数据包的形式出现。

c)您正在使用默认的字符编码,它可能在不同的机器上有所不同,从而在过程中损坏文本。

0

所有这一切的含义是:

  1. 在发送方使用你字节500..BYTES_PER_PACKET-500的源阵列的创建的DatagramPacket

  2. 您发送了数据包。它以UDP数据报的形式通过网络。它作为UDP数据报到达。

  3. 在接收器中,您构造了一个新的字节数组,并在其周围构造了一个新的DatagramPacket,指定偏移量= 0或无偏移量参数。您收到DatagramPacket. Java将UDP数据报放入DatagramPacket,中的字节数组中,从您指定的偏移量开始,为零。

请注意,发件人的DatagramPacket本身没有通过线路,也没有发送者的字节数组。

相关问题