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

时间:2016-03-28 19:19:54

标签: java sockets tcp objectinputstream

我用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连接,这使我认为它仍然是出站 - >入站防火墙问题,无论出于何种原因。

0 个答案:

没有答案