这是我的发件人程序
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();
}
}
}
我得到的是,当侦听器运行时,它似乎正在等待发送方发送数据(打印“开始侦听”)。执行发件人后,它似乎也可以正常运行(打印“正在发送数据”)。接收器也执行得更好(打印“完成!”),但是数据包仍然为空。
可能是什么问题?
最佳答案
问题是您永远不会在包中放入任何东西。首先,创建一个空数据包,然后用数据填充缓冲区-但该数据包中未使用该缓冲区。
颠倒顺序:
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);
正如Jon Skeet所述,您还需要担心两端的字符编码。如果在接收端执行
String.getBytes()
或new String(byte[])
时未指定编码,则将在计算机上使用默认的字符编码。如果您使用的是同一台计算机,这很好,但是如果发送方和接收方在不同的计算机上,并且计算机具有不同的平台默认字符编码,则可能会造成很多问题。因此,您需要指定编码,如果发送的大部分文本都使用拉丁脚本,则最好是UTF8。
因此,在发送方:
byte[] buffer = data.getBytes(StandardCharsets.UTF_8);
在接收端:
String receivedData = new String(packet.getData(), StandardCharsets.UTF_8);