在Java中发送UDP数据包并接收响应

5

我需要发送一个UDP数据包并从UDP服务器获得响应。我曾认为UDP与Java中的java.net.DatagramPacket类似,但是DatagramPacket的文档似乎表明,您只发送了一个数据包而没有收到任何返回值。这是否是正确的方法?或者我应该使用java.net.Socket类?


2
UDP是数据报。除非接收方发送回复,否则您将不会收到任何返回信息。TCP套接字也是如此。如果您告诉我们您想要做什么,也许我们可以帮助您? - Erik
好的,服务器已经存在(不是我编写的),当我发送一个数据包时,它应该返回一些东西,但我如何获取它发送回来的数据包? - Paul Taylor
第一个问题是:服务器是否会发送UDP回复?如果是,您需要通过Datagram.receive()方法从自己的UDP套接字中读取。 - Erik
Max已经回答了,谢谢。 - Paul Taylor
4个回答

11

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();
   }
}

这看起来不错,但是服务器似乎没有定义数据包长度,也就是说,我认为服务器返回的数据包长度并不总是相同的,所以我只需要确保receiveData缓冲区足够大,能够处理最大可能的数据包大小。 - Paul Taylor
是的。UDP是一种不可靠的协议,很少用于发送大块数据。但是,在接收到数据包后,您可以通过DatagramPacket.getLength()读取实际包含的字节数。 - bezmax
2
receivePacket.getData() 不仅包含接收到的数据,还包含缓冲区中未使用的部分。要获取一个包含接收到的数据的字符串,请使用 new String(receivePacket.getData(), 0, receivePacket.getLength(), StandardCharsets.UTF_8),并根据您所期望的字符集进行调整。 - Augustus Kling
我只是想确认一下,使用同一个套接字对象发送/接收是否可行?我在阅读另一个问题时,有一个用户坚称必须有一个套接字用于接收,另一个用于发送,尽管如果他们需要使用相同的端口(你会得到一个异常),这似乎是不可能的。 - The Unknown Dev

2

2

1

UDP不是广播。广播是一个IP层的事情。 - OrangeDog
可能更准确地说,TCP 只能发送到单个目的地,而 UDP 可以发送到多个目的地。另请参阅:https://dev59.com/cmEi5IYBdhLWcg3wd8AF#21267149 - wrschneider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接