2016-09-16 149 views
0

這裏是我的發件人程序Java的UDP接收機無法接收數據

import java.net.*; 

class Send{ 
    public static void main(String[] args) { 
     try{ 
      //setup 
      DatagramSocket socket=new DatagramSocket(); 
      byte[] buffer=new byte[100]; 
      InetAddress address=InetAddress.getLocalHost(); 
      System.out.println("Address:"+address); 
      DatagramPacket packet=new DatagramPacket(buffer,buffer.length,address,10000); 

      //get data 
      String data="Hello"; 

      //send data 
      buffer=data.getBytes(); 
      System.out.println("Sending data"); 
      socket.send(packet); 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 

這裏是接收器方案

import java.net.*; 

class Listen{ 
    public static void main(String[] args) { 
     try{ 
      //set up 
      DatagramSocket socket=new DatagramSocket(10000); 
      byte[] buffer=new byte[100]; 
      DatagramPacket packet=new DatagramPacket(buffer,buffer.length); 
      //recieve 
      System.out.println("Started Listening"); 
      socket.receive(packet); 
      //print 
      String receivedData=new String(packet.getData()); 
      System.out.println(receivedData);    
      System.out.println("Done!"); 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 

    } 
} 

我得到的是,監聽器正在運行時,它似乎是在等待發件人發送數據(打印「開始聆聽」)。發件人執行時,它似乎也正常運行(打印「發送數據」)。接收器也進一步執行(打印「完成!」),但數據包保持空白。

可能是什麼問題?

回答

2

問題是,你從來沒有把任何東西放在數據包中。首先創建一個空數據包,然後用數據填充一個緩衝區 - 但該數據包中沒有使用該緩衝區。

反向事物的秩序:

 String data="Hello"; 
     //get data 
     // HERE : first put data in the buffer, THEN build the packet 
     byte[] buffer=data.getBytes(); 

     InetAddress address=InetAddress.getLocalHost(); 
     System.out.println("Address:"+address); 
     DatagramPacket packet=new DatagramPacket(buffer,buffer.length,address,10000); 

     //send data 
     System.out.println("Sending data"); 
     socket.send(packet); 

由於喬恩斯基特提到的,你還需要擔心兩端的字符編碼。如果您在接收端執行String.getBytes()new String(byte[])時未指定編碼,那麼您將在計算機上使用默認字符編碼。如果您在同一臺計算機上,這很好,但如果發件人和接收者位於不同的計算機上,並且計算機具有不同的平臺默認字符編碼,則會造成很多問題。

所以你需要指定的編碼,如果你發送的大部分文本是使用拉丁腳本,你最好的最好的可能是UTF8。

所以在發送端:

byte[] buffer = data.getBytes(StandardCharsets.UTF_8); 

而在接收端:

String receivedData = new String(packet.getData(), StandardCharsets.UTF_8); 
+0

雖然最好避免使用二進制/文本轉換位平臺的默認編碼,太... –

+0

@JonSkeet好點,我已經添加了一些解釋。 –

+0

'StandardCharsets.UTF_8'是你的朋友,國際海事組織:) –

0

與您的數據填充緩衝區之前,您所創建的數據包,因此,您所發送的空的緩衝區。

更改如下行的順序和程序按預期工作:

//get data 
String data="Hello"; 
buffer=data.getBytes(); 
DatagramPacket packet=new DatagramPacket(buffer,buffer.length,address,10000);