Java ObjectInputStream即使在刷新后也会挂起服务器和客户端
我已经用Java编写了一个基本的TCP聊天,当在本地(即localhost)进行测试时,它工作得很好。我可以连接、键入消息并接收,而不会出现问题。我一秒钟可以连接和断开几次 但是,当尝试通过路由器的外部IP进行连接时,无论出于何种原因,当尝试在客户端和服务器端初始化ObjectInputStream时,它都会挂起。所以我猜这和我的路由器防火墙有关,我在上面添加了防火墙规则。我只为建立连接的特定端口1777创建了防火墙规则,刷新ObjectOutputStream时发送的数据是否可能在另一个端口上发送?考虑到套接字绑定到特定的端口,我想这是没有意义的 我在初始化ObjectOutputStream之后进行刷新,并且在创建ObjectInputStream之前在两侧进行刷新。对我来说没有意义的是,它允许建立连接 我想在这种情况下,代码可能是不相关的,但无论如何,这里是: 此线程始终运行,等待连接,然后启动一个新线程来处理连接客户端:Java ObjectInputStream即使在刷新后也会挂起服务器和客户端,java,sockets,tcp,objectinputstream,Java,Sockets,Tcp,Objectinputstream,我已经用Java编写了一个基本的TCP聊天,当在本地(即localhost)进行测试时,它工作得很好。我可以连接、键入消息并接收,而不会出现问题。我一秒钟可以连接和断开几次 但是,当尝试通过路由器的外部IP进行连接时,无论出于何种原因,当尝试在客户端和服务器端初始化ObjectInputStream时,它都会挂起。所以我猜这和我的路由器防火墙有关,我在上面添加了防火墙规则。我只为建立连接的特定端口1777创建了防火墙规则,刷新ObjectOutputStream时发送的数据是否可能在另一个端口上
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=newObjectInputStream(socket.getInputStream());”
有什么问题吗?我还可以通过我的本地IP连接,这让我觉得无论出于何种原因,这仍然是出站->入站防火墙问题。如果您怀疑您的防火墙存在干扰,那么检查其日志似乎是合乎逻辑的。这应该告诉你它是否阻止了你系统中的流量,如果阻止了,它应该会让你很好地了解原因。没关系!似乎我无法从网络内部连接到自己的路由器。当一位朋友尝试从他的网络连接时,效果非常好:-)无论如何,谢谢你的帮助!您应该在
run()
方法中创建流,而不是在构造函数中创建流,这样它就发生在新线程上,不会打乱accept循环。