我需要发送一个UDP数据包并从UDP服务器获得响应。我曾认为UDP与Java中的java.net.DatagramPacket类似,但是DatagramPacket的文档似乎表明,您只发送了一个数据包而没有收到任何返回值。这是否是正确的方法?或者我应该使用java.net.Socket类?
我需要发送一个UDP数据包并从UDP服务器获得响应。我曾认为UDP与Java中的java.net.DatagramPacket类似,但是DatagramPacket的文档似乎表明,您只发送了一个数据包而没有收到任何返回值。这是否是正确的方法?或者我应该使用java.net.Socket类?
UDP数据报发送和接收的示例(来源):
import java.io.*;
import java.net.*;
class UDPClient
{
public static void main(String args[]) throws Exception
{
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("localhost");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
}
}
DatagramPacket.getLength()
读取实际包含的字节数。 - bezmaxreceivePacket.getData()
不仅包含接收到的数据,还包含缓冲区中未使用的部分。要获取一个包含接收到的数据的字符串,请使用 new String(receivePacket.getData(), 0, receivePacket.getLength(), StandardCharsets.UTF_8)
,并根据您所期望的字符集进行调整。 - Augustus Klinghttp://docs.oracle.com/javase/tutorial/networking/datagrams/clientServer.html
你想查看DatagramSocket#receive。这正是UDP和TCP套接字之间的区别。
UDP是广播,而使用java.net.Socket的TCP是点对点的。 UDP是“射后不理”的,类似于在JMS主题上发布消息。
请参阅:http://docs.oracle.com/javase/tutorial/networking/datagrams/index.html