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 不同网络不能聊天的主要内容,如果未能解决你的问题,请参考以下文章