这是我的发件人计划
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();
}
}
}
我得到的是,当监听器正在运行时,它似乎在等待发送者发送数据(打印"开始收听")。执行发件人时,它似乎也正常运行(打印"发送数据")。接收器也会进一步执行(打印"完成!"),但数据包仍为空。
可能是什么问题?
答案 0 :(得分: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);
正如Jon Skeet所提到的,你还需要担心两端的字符编码。如果在接收方执行String.getBytes()
或new String(byte[])
时未指定编码,则将在计算机上使用默认字符编码。如果您在同一台计算机上,这很好,但如果发件人和收件人在不同的计算机上并且计算机具有不同的平台默认字符编码,则可能会产生很多问题。
因此,您需要指定编码,如果您发送的大多数文本都使用拉丁文脚本,那么您最好的可能是UTF8。
所以在发送方:
byte[] buffer = data.getBytes(StandardCharsets.UTF_8);
在接收方:
String receivedData = new String(packet.getData(), StandardCharsets.UTF_8);
答案 1 :(得分:0)
在使用数据填充缓冲区之前,您正在创建数据包,因此您正在发送空缓冲区。
按如下所示更改行的顺序,程序按预期工作:
//get data
String data="Hello";
buffer=data.getBytes();
DatagramPacket packet=new DatagramPacket(buffer,buffer.length,address,10000);