2016-09-16 88 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);