2012-05-22 262 views
0

我想通過發送和UDP套接字接收數據(Unicode的UTF-8字符串,DatagramSocket。我一直在尋找到SO答案,但只能使用InputStream和喜歡TCP傳輸解決方案找到。Unicode字符串

是否有UDP?

類似的方式

UDP客戶

package testsocket; 

import java.io.IOException; 
import java.net.*; 

public class TestSocketSender { 

    private DatagramSocket sock; 

    public static void main(String[] args) { 
     new TestSocketSender(); 
    } 

    public TestSocketSender(){ 
     try { 
      sock = new DatagramSocket();//, Inet4Address.getLocalHost()); 
      sendData("Hello World\u00A9"); 
     } catch (SocketException ex) { 
      ex.printStackTrace(); 
     } catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 

    private void sendData(String data) throws IOException{ 
     DatagramPacket datagram = new DatagramPacket(data.getBytes("utf-8"), data.length(), InetAddress.getLocalHost(), 5060); 
     sock.send(datagram); 
    } 
} 

UDP服務器

package testsocket; 

import java.io.IOException; 
import java.net.*; 

public class TestSocketListerner { 

    private DatagramSocket sock; 

    public static void main(String[] args) { 
     new TestSocketListerner(); 
    } 

    public TestSocketListerner(){ 
     try { 
      sock = new DatagramSocket(5060);//, Inet4Address.getLocalHost()); 
      while(true){ 
       System.out.println(recvData()); 
      } 
      } catch (SocketException ex) { 
      ex.printStackTrace(); 
     } catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 

    private String recvData() throws IOException{ 
     byte[] data = new byte[100]; 
     DatagramPacket datagram = new DatagramPacket(data , data.length); 
     sock.receive(datagram); 
     return new String(datagram.getData(),datagram.getOffset(),datagram.getLength(),"utf-8"); 
    } 


} 

回答

1

UDP是基於數據報的協議。這意味着您只能發送固定數量的數據,而無需擔保所傳遞的數據。數據包可能會丟失,因爲即使CRC在UDP中不是強制性的,甚至更糟 - 因爲在數據包路徑上有多個路由器,您發送的數據包可能會在接收端進行重新排序,所以內部數據可能會損壞。

使用UDP通道來實現看起來像Stream的東西並不是微不足道的,但肯定可行。您必須將數據分成小部分(系統的MTU),將它們打包一些恢復信息,爲每個數據包分配序列號,並提供一些機制來重新分配在途中丟失的數據包。

-1

先發送長度。

讓您的發件人首先打包字節,然後發送長度,然後發送字符串。我建議你把它打包成四個字節。

請您的讀者閱讀4個字節,然後重新構造長度,然後讀取字符串。

然後您可以處理數據未到達和超時等問題...