Java ObjectInputStream即使在刷新后也会挂起服务器和客户端

Java ObjectInputStream即使在刷新后也会挂起服务器和客户端,java,sockets,tcp,objectinputstream,Java,Sockets,Tcp,Objectinputstream,我已经用Java编写了一个基本的TCP聊天,当在本地(即localhost)进行测试时,它工作得很好。我可以连接、键入消息并接收,而不会出现问题。我一秒钟可以连接和断开几次 但是,当尝试通过路由器的外部IP进行连接时,无论出于何种原因,当尝试在客户端和服务器端初始化ObjectInputStream时,它都会挂起。所以我猜这和我的路由器防火墙有关,我在上面添加了防火墙规则。我只为建立连接的特定端口1777创建了防火墙规则,刷新ObjectOutputStream时发送的数据是否可能在另一个端口上

我已经用Java编写了一个基本的TCP聊天,当在本地(即localhost)进行测试时,它工作得很好。我可以连接、键入消息并接收,而不会出现问题。我一秒钟可以连接和断开几次

但是,当尝试通过路由器的外部IP进行连接时,无论出于何种原因,当尝试在客户端和服务器端初始化ObjectInputStream时,它都会挂起。所以我猜这和我的路由器防火墙有关,我在上面添加了防火墙规则。我只为建立连接的特定端口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=newObjectInputStream(socket.getInputStream());”


有什么问题吗?我还可以通过我的本地IP连接,这让我觉得无论出于何种原因,这仍然是出站->入站防火墙问题。

如果您怀疑您的防火墙存在干扰,那么检查其日志似乎是合乎逻辑的。这应该告诉你它是否阻止了你系统中的流量,如果阻止了,它应该会让你很好地了解原因。没关系!似乎我无法从网络内部连接到自己的路由器。当一位朋友尝试从他的网络连接时,效果非常好:-)无论如何,谢谢你的帮助!您应该在
run()
方法中创建流,而不是在构造函数中创建流,这样它就发生在新线程上,不会打乱accept循环。