【问题标题】:Need to send a UDP packet and receive a response in Java需要在 Java 中发送 UDP 数据包并接收响应
【发布时间】:2012-01-23 15:55:22
【问题描述】:

我必须发送一个 UDP 数据包并从 UDP 服务器获得响应。我虽然 UDP 与 Java 中的 java.net.DatagramPacket 类似,但 DatagramPacket 的文档似乎是您发送了一个数据包但没有得到任何返回,这是正确的使用方法还是我应该使用 java。 net.Socket

【问题讨论】:

  • UDP 是数据报。除非接收者发回一些东西,否则你不会得到任何东西。 tcp 套接字也是如此。如果你告诉我们你想做什么,也许?
  • 好吧,服务器已经存在(不是我写的)当我向它发送一个数据包时它应该发回一些东西但是我如何得到它发回的数据包?
  • 第一个问题是:服务器是否发回udp?如果是这样,您需要通过 Datagram.receive() 方法从您自己的 UDP 套接字中读取数据。
  • Max 已在下面回答谢谢。

标签: java sockets udp datagram


【解决方案1】:

这正是 UDP 和 TCP 套接字之间的区别。

UDP 是广播的,而带有 java.net.Socket 的 TCP 是点对点的。 UDP 是即发即弃的,类似于在 JMS 主题上发布消息。

见:http://docs.oracle.com/javase/tutorial/networking/datagrams/index.html

【讨论】:

【解决方案2】:

Java 文档确实介绍了如何编写客户端和服务器。

http://docs.oracle.com/javase/tutorial/networking/datagrams/clientServer.html

你想看DatagramSocket#receive

【讨论】:

    【解决方案3】:

    UDP数据报发送和接收示例(source):

    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 缓冲区足够大以处理可能的最大数据包大小。
    • 是的。 UDP 是不可靠的协议,很少用于通过它发送大块数据。但是,在收到数据包后,您可以从DatagramPacket.getLength() 中读取实际包含的字节数。
    • receivePacket.getData() 不仅包含接收到的数据。它也包含缓冲区的未使用部分。要使用接收到的数据获取字符串,请使用 new String(receivePacket.getData(), 0, receivePacket.getLength(), StandardCharsets.UTF_8) 并将字符集调整为您所期望的。
    • 只是想确认使用同一个套接字对象发送/接收是可以接受的吗?我正在阅读另一个问题,其中用户坚持必须有一个套接字来接收和发送,尽管如果他们需要使用相同的端口,这似乎是不可能的(你会得到一个例外)。
    【解决方案4】:

    您必须使用 DatagramPacket 和 DatagramSocket。当你发送一个数据包时,你只是发送一个数据包。但是,当您收到一个数据包时,您可以得到一个从另一个程序发送的数据包(例如服务器回复)

    http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html

    Socket 仅用于 TCP 连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-14
      • 2012-10-03
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 2015-12-29
      相关资源
      最近更新 更多