【问题标题】:Does a UDP connection require a server/client?UDP 连接是否需要服务器/客户端?
【发布时间】:2021-01-07 23:48:36
【问题描述】:

我想通过同一以太网连接向另一台设备发送 UDP 数据包/消息,但我不确定服务器/客户端关系在哪里。

接收消息被配置为在收到消息后自动发回响应,因此两个设备将只是相互通信......

我错过了什么吗?

我很困惑,因为我用来从客户端向服务器发送消息的代码具有参数“服务器 ip”和“服务器端口”,所以我不确定是否可以 1) 只需替换参数并使用相同的代码和 2)如果可能的话,在这些参数中输入什么,初始设备的端口号和 ip?还是第二台设备的?

谢谢!

代码sn-p:

new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        InetAddress SERVERIP = InetAddress.getByName(SERVER_IP);
                        DatagramSocket socket = new DatagramSocket();
                        socket.setBroadcast(true);
                        byte[] msg = message.getBytes();
                        DatagramPacket packet = new DatagramPacket(msg, message.length(), 
                                SERVERIP, SERVERPORT);
                        socket.send(packet);
                        socket.close();
                    } catch(Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        

【问题讨论】:

  • 您可以将短语“client”替换为“source”,将“server”替换为连接的“destination”。
  • 所以我应该将 ServerIP 和 ServerPort 替换为目标的 ip 和端口? @SteffenUllrich
  • UDP 是明确的 connectionless,因此不存在 UDP 连接之类的东西。此外,客户端/服务器是 UDP 一无所知的应用层概念。 UDP 没有客户端或服务器。 UDP 是一种即发即弃的协议,它只发送数据报,而不期望对方甚至收到数据报。
  • @RonMaupin:是和不是。虽然没有像 TCP 那样具有专用连接开始(SYN 等)和连接结束(FIN 等)的“真正”连接,但从同一源 ip+port 到同一目标 ip+port 的许多数据包通常被认为是联系。这样的连接在 NAT 中也有明确的支持,connect 函数也可用于 UDP 套接字。 UDP中也有客户端/服务器,例如DNS服务器,实现QUIC协议(即UDP)的Web服务器等。总的来说,客户端和服务器无论如何都是应用层的概念。
  • @SteffenUllrich,是的,这就是我发表评论的原因。如果您在尝试使用网络 API 之前了解网络概念,包括网络堆栈层,以及层背后的抽象和封装的概念,网络编程会容易得多。

标签: java android networking server udp


【解决方案1】:

我不完全确定您想要回答的问题是如何从接收消息的设备响应发送消息的设备。

如果是这种情况,那么以下代码是一个基本示例,说明如何通过从通过套接字接收的数据包中获取地址和端口来响应初始发送设备。

// Receive and respond thread.
new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        // Receive

                        DatagramSocket socket = new DatagramSocket(4445);
                        byte[] buf = new byte[256];
                        DatagramPacket packet = new DatagramPacket(buf, buf.length);
                        socket.receive(packet);

                        // Respond

                        // Get sender's/return address from the packet that was received.
                        InetAddress address = packet.getAddress();
                        // Get sender's/return port from the packet that was received.
                        int port = packet.getPort();
                        packet = new DatagramPacket(buf, buf.length, address, port);
                        socket.send(packet);
                        socket.close();

                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

我还建议阅读以下关于编写数据报服务器和客户端的documentation

【讨论】:

    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2011-08-15
    相关资源
    最近更新 更多