Java UDP 接收器未接收数据
Java UDP Receiver not receiving data
这是我的 Sender 程序
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();
}
}
}
我得到的是,当 Listener 运行ning 时,它似乎在等待发送者发送数据(打印 "started Listening")。当发送者被执行时,它似乎也正确 运行(打印 "Sending data")。接收器也进一步执行(打印 "Done!"),但数据包仍然是空的。
可能是什么问题?
问题是你从来没有在包裹里放任何东西。首先创建一个空数据包,然后用数据填充缓冲区 - 但数据包中未使用该缓冲区。
颠倒事物的顺序:
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);
您在用数据填充缓冲区之前创建了数据包,因此您发送的是一个空缓冲区。
按如下方式更改行的顺序,您的程序将按预期运行:
//get data
String data="Hello";
buffer=data.getBytes();
DatagramPacket packet=new DatagramPacket(buffer,buffer.length,address,10000);
这是我的 Sender 程序
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();
}
}
}
我得到的是,当 Listener 运行ning 时,它似乎在等待发送者发送数据(打印 "started Listening")。当发送者被执行时,它似乎也正确 运行(打印 "Sending data")。接收器也进一步执行(打印 "Done!"),但数据包仍然是空的。
可能是什么问题?
问题是你从来没有在包裹里放任何东西。首先创建一个空数据包,然后用数据填充缓冲区 - 但数据包中未使用该缓冲区。
颠倒事物的顺序:
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);
您在用数据填充缓冲区之前创建了数据包,因此您发送的是一个空缓冲区。
按如下方式更改行的顺序,您的程序将按预期运行:
//get data
String data="Hello";
buffer=data.getBytes();
DatagramPacket packet=new DatagramPacket(buffer,buffer.length,address,10000);