UDP Chat Program 不同网络不能聊天

Posted

技术标签:

【中文标题】UDP Chat Program 不同网络不能聊天【英文标题】:UDP Chat Program different networks can't chat 【发布时间】:2021-09-04 11:27:28 【问题描述】:

我正在尝试制作一个聊天程序,客户端和服务器可以在其中在不同的网络(不是本地主机)上相互聊天我目前面临一个我不知道的问题知道怎么解决。

由于某种原因,客户端和服务器无法相互连接,当我使用客户端向服务器写入消息时,服务器上没有弹出任何内容。测试在不同网络(移动数据和以太网)上的两台不同计算机上运行

我在代码中使用了来自以太网的公共 ip,并在代码中使用匹配的端口号对其进行了端口转发。服务器正在端口转发网络上运行。

这是我的代码:

客户:


import java.io.*;
import java.net.*;
import java.util.Scanner;

public class ChatClient 

    public static void main(String[] args) throws IOException 
        Scanner scanner = new Scanner(System.in);
        DatagramSocket client = new DatagramSocket(7000);

        byte[] receivedData = new byte[1024];
        byte[] sentData;

        InetAddress address = InetAddress.getByName(" PUBLIC IP IS HERE, won't show it for obvious reasons ");

        while (true) 
            String message = scanner.nextLine();
            sentData = message.getBytes();

            DatagramPacket dp1 = new DatagramPacket(sentData, sentData.length, address, 7000);
            client.send(dp1);

            DatagramPacket dp4 = new DatagramPacket(receivedData, receivedData.length);
            client.receive(dp4);

            String receivedMessage = new String(dp4.getData());
            System.out.println(receivedMessage);
        

    

服务器:


import java.io.*;
import java.net.*;
import java.util.Scanner;

public class ChatServer 

    public static void main(String[] args) throws IOException 
        DatagramSocket server = new DatagramSocket();
        Scanner scanner = new Scanner(System.in);

        byte[] receivedData = new byte[1024];
        byte[] sentData;

        while (true) 
            DatagramPacket dp2 = new DatagramPacket(receivedData, receivedData.length);
            server.receive(dp2);

            String storedData = new String(dp2.getData());
            System.out.println(storedData);

            InetAddress getIP = dp2.getAddress();
            int port = dp2.getPort();

            String sentMessage = scanner.nextLine();
            sentData = sentMessage.getBytes();

            DatagramPacket dp3 = new DatagramPacket(sentData, sentData.length, getIP, port);
            server.send(dp3);
        

    

代码仅在更改为 localhost 时有效。

有谁知道我做错了什么?非常感谢任何回复。

【问题讨论】:

【参考方案1】:

假设客户端连接到服务端,服务端需要指定监听的端口,客户端需要指定服务端的IP和端口。

客户:

InetAddress address = InetAddress.getByName(" PUBLIC IP IS HERE"); 
DatagramSocket client = new DatagramSocket();
//...
DatagramPacket dp1 = new DatagramPacket(sentData, sentData.length, address, 7000);//the port should be the publicly exposed port
client.send(dp1);

这将连接到具有指定 IP 和端口的服务器。

服务器:

DatagramSocket server = new DatagramSocket(7000);//port to forward

这意味着服务器侦听端口 7000,因此它在该端口下可用。

除此之外,请确保端口转发正常工作。如果使用 UDP,还需要为 TCP 配置。

另请注意,UDP 既不确认也不验证包。如果您想拥有这些功能,则需要使用 TCP 或自己实现这些功能。

【讨论】:

这些更改导致聊天客户端中的第 17 行异常:线程“main”java.net.BindException 中的异常:无法分配请求的地址:无法绑定 我的错,我把客户端搞砸了。现在可以用了吗?

以上是关于UDP Chat Program 不同网络不能聊天的主要内容,如果未能解决你的问题,请参考以下文章

XMPP Chat 与不在网络中的客户端一起使用

新手网络编程之UDP实现聊天室

chat集群聊天室项目 代码+讲解:网络模块

chat集群聊天室项目 代码+讲解:网络模块

如何测试聊天网络应用

UDP 在多个端口上接收数据