我用Java编写了一个基本的TCP聊天,当在本地测试时(即localhost),它一直运行良好。我可以连接,给自己输入消息并且没有问题地接收。我可以每秒连接和断开几次。
但是,当尝试在客户端而不是服务器端尝试初始化ObjectInputStream时,无论出于何种原因,它都尝试连接我的路由器的外部IP。所以我猜这与我的路由器防火墙有关,我在其上添加了防火墙规则。我只为我建立连接的特定端口1777创建了防火墙规则,是否可能在另一个端口上发送刷新ObjectOutputStream时发送的数据?考虑到套接字绑定到特定端口,这是没有意义的。
我在初始化ObjectOutputStream之后正在刷新,并且我在创建两侧的ObjectInputStream之前创建了它。对我来说没有意义的是它允许建立连接。
我想在这种情况下代码可能无关紧要,但无论如何它仍然存在:
此线程始终运行,等待连接然后启动一个新线程来处理连接客户端:
public void run() {
while (connected) {
try (ServerSocket serverSocket = new ServerSocket(port)) {
Socket socket = serverSocket.accept();
new ClientHandler(socket);
} catch (IOException e) {
...
}
}
}
ClientHandler类的构造函数:
public ClientHandler(Socket socket) throws IOException {
outputStream = new ObjectOutputStream(socket.getOutputStream());
outputStream.flush();
inputStream = new ObjectInputStream(socket.getInputStream());
welcomeClient();
start(); // Start listening for messages.
}
这是ClientHandler线程挂起的地方。
这是客户端代码:
// Get IP, port and stuff
socket = new Socket(ip, port);
outputStream = new ObjectOutputStream(socket.getOutputStream());
outputStream.flush();
inputStream = new ObjectInputStream(socket.getInputStream());
// Write a couple objects and read some objects.
它们都挂在“inputStream = new ObjectInputStream(socket.getInputStream());”
可能是什么问题?我也可以通过我的本地IP连接,这使我认为它仍然是出站 - >入站防火墙问题,无论出于何种原因。