UDP聊天程序不同网络无法聊天
UDP Chat Program different networks can't chat
我正在尝试制作一个客户端和服务器可以在不同网络(不是本地主机)上相互聊天的聊天程序我目前遇到了一个问题我不知道如何解决。
由于某种原因,客户端和服务器无法相互连接,当我用客户端向服务器写消息时,服务器上没有弹出任何内容。测试 运行 在两台不同的计算机上,在不同的网络(移动数据和以太网)
我在代码中使用了来自我的以太网的 public 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);
}
}
}
代码仅在更改为本地主机时有效。
有谁知道我做错了什么?非常感谢任何回复。
假设客户端连接到服务器,服务器需要指定监听的端口,客户端需要指定服务器的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 或自己实现这些功能。
我正在尝试制作一个客户端和服务器可以在不同网络(不是本地主机)上相互聊天的聊天程序我目前遇到了一个问题我不知道如何解决。
由于某种原因,客户端和服务器无法相互连接,当我用客户端向服务器写消息时,服务器上没有弹出任何内容。测试 运行 在两台不同的计算机上,在不同的网络(移动数据和以太网)
我在代码中使用了来自我的以太网的 public 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);
}
}
}
代码仅在更改为本地主机时有效。
有谁知道我做错了什么?非常感谢任何回复。
假设客户端连接到服务器,服务器需要指定监听的端口,客户端需要指定服务器的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 或自己实现这些功能。