2013-04-29 24 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本身沒有通過線路,也沒有發送者的字節數組。

相關問題