当我使用Udp DatagramSocket 和 DatagramPacket 类时,我无法得到响应。我使用Tcp Socket 测试了相同的服务器并且它正确响应。
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(0); // random available port
System.out.println("port: " + socket.getLocalPort());
socket.setSoTimeout(3000); // 3 seconds timeout
DatagramPacket request = new DatagramPacket(new byte[1], 1, InetAddress.getByName("time.nist.gov"),
13);
DatagramPacket response=new DatagramPacket(new byte[1024],1024);
socket.send(request);
socket.receive(response);
String daytime = new String(response.getData(), 0, response.getLength(),
"US-ASCII");
System.out.println(daytime);
}
答案 0 :(得分:1)
这不起作用,因为TCP是点对点的,需要有人在另一端阅读。
然而,UDP是火灾和遗忘,(指向多点)所以当你.send(...)数据包的那一刻已经在进行中。您对.receive(...)的调用只是迟到了。
修复你的例子,在主线程中调用.send(...)之前调用.receive(...)的线程。
由于与TCP相同的原因,您的代码也存在问题。它只是起作用,因为发送的单个字节很容易适应堆栈中的缓冲区。因此,要使用TCP打破您的示例,只需使您发送的有效负载足够大。如果没有人在另一端接收,您的发送操作将无限期地阻止(或超时)。