【问题标题】:What happens if I just send to UDP socket and dont recive如果我只是发送到 UDP 套接字而不接收会发生什么
【发布时间】:2020-11-04 12:30:34
【问题描述】:

我有一个 UDP 客户端的最小实现:

final class UdpClient {
  private final DatagramSocket socket;
  private final InetAddress address;
  private final Integer port;

  UdpClient(URI location) {
    port = location.getPort();
    try {
      socket = new DatagramSocket();
      address = InetAddress.getByName(location.getHost());
    } catch (SocketException | UnknownHostException e) {
      throw new RuntimeException("Error setting up UDP connection", e);
    }
  }

  void sendData(String msg) {
    byte[] buf = msg.getBytes();
    DatagramPacket packet
        = new DatagramPacket(buf, buf.length, address, port);
    try {
      socket.send(packet);
    } catch (IOException e) {
      LOG.warn("Failed to send data {}", e.getMessage());
    }
  }

  public void close() {
    socket.close();
  }
}

现在我开始质疑这是否是一个有效的 impl,因为我从未收到过回复。我不关心回复的后果是什么?这甚至是一个没有明确得到回复的有效 impl 吗?

更新

我提出问题的原因是我担心如果我从不进行显式接收,可能会有一些底层缓冲区正在填满。此客户端可用于发送回复的服务器或不发送回复的服务器。

【问题讨论】:

  • 您期待回复吗?
  • 不确定服务器是如何工作的,但即使有回复,我也不在乎。

标签: java networking udp


【解决方案1】:

现在我开始质疑这是否是一个有效的 impl,因为我从未收到过回复。

这是一个有效的实现。

我不关心回复的后果是什么?

唯一真正的后果是客户端无法判断它正在发送数据包的服务器是否正在接收它们。

这对你来说可能是可以接受的。

这甚至是一个没有明确得到回复的有效 impl 吗?

从Java和UDP规范的角度来看是有效的。

这是否有意义......我们无法判断......因为你没有解释你为什么要这样做。

我提出问题的原因是我担心如果我从不进行显式接收,可能会有一些底层缓冲区正在填满。

没有……在你的意思上。可能有一个传出的数据包缓冲区,它可能会溢出,但这只会发生在某些类型的网络链接上,不会因为没有收到回复而触发。 (如果链接速度很慢并且无法足够快地发送数据,则可能会发生这种情况。但如果发生这种情况,客户端的操作系统应该悄悄地将数据包从缓冲区中丢弃。您的应用程序不会知道这是正在发生。)


但是,您的实施存在一些问题:

问题 #1

  address = InetAddress.getByName(location.getHost());

您忽略了 URI 的“协议”。例如,如果 URI 是托管“http”服务的资源,您最终会在(通常)端口 80 上向主机发送 UDP 数据包。但是 Web 服务器不会在端口 80 上侦听 UDP 数据包。您发送的数据包可能会被忽略。

问题 #2

 throw new RuntimeException("Error setting up UDP connection", e);

UDP 是无连接的,因此您没有建立连接。此外,此时实际上还没有数据包被发送到远程主机。您实际所做的唯一一件事就是尝试将远程服务器的 DNS 名称解析为 IP 地址。

问题 #3

 LOG.warn("Failed to send data {}", e.getMessage());

确实,您已经到了那个地步,您未能发送数据包。然而,如果你没有得到这个异常,你唯一知道的就是你已经让一个数据包开始了它的旅程。您甚至不知道该数据包是否已从客户端计算机发送出去。

【讨论】:

    猜你喜欢
    • 2013-03-21
    • 2015-02-21
    • 2017-09-11
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2012-04-26
    相关资源
    最近更新 更多