Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UDP连接是否需要服务器/客户端?_Java_Android_Networking_Server_Udp - Fatal编程技术网

Java UDP连接是否需要服务器/客户端?

Java UDP连接是否需要服务器/客户端?,java,android,networking,server,udp,Java,Android,Networking,Server,Udp,我想在同一以太网连接上向另一个设备发送UDP数据包/消息,但我不确定服务器/客户机关系在哪里 接收消息配置为在接收到消息时自动发送响应,因此两个设备将只是相互通信 我错过什么了吗 我很困惑,因为我用来从客户端向服务器发送消息的代码有参数“服务器ip”和“服务器端口”,所以我不确定是否可以1)替换参数并使用相同的代码,2)如果可能,在这些参数中放入什么,初始设备的端口和ip?还是第二台设备的 谢谢 代码片段: new Thread(new Runnable() {

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

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

我错过什么了吗

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

谢谢

代码片段:

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

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

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

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

我还建议您阅读以下有关编写数据报服务器和客户端的内容。

您可以将连接的短语“客户端”替换为“源”,将“服务器”替换为“目标”。因此,我应该将ServerIP和ServerPort替换为目标的ip和端口@SteffenUllrichUDP是显式无连接的,因此不存在UDP连接。此外,客户机/服务器是UDP不知道的应用层概念。UDP没有客户端或服务器。UDP是一种“即发即忘”协议,它只发送数据报,而不期望另一方收到数据报。@RonMaupin:是和否。虽然没有像TCP中那样的“真正”连接,但有一个专用的连接开始(SYN等)和连接结束(FIN等),从同一源ip+端口到同一目标ip+端口的多个数据包通常被视为一个连接。这种连接在NAT中也有明确的支持,
connect
函数也可用于UDP套接字。UDP中也有客户机/服务器,如DNS服务器、实现QUIC协议(即UDP)的web服务器等。总之,客户机和服务器是应用层的概念。@SteffenUllrich,是的,这就是我发表评论的原因。如果您在尝试使用网络API之前理解网络概念,包括网络堆栈层,以及层后面的抽象和封装思想,那么网络编程就会变得非常容易。