try catch - try块中的Java不可达代码



我正在开发一个与服务器通信的聊天客户端。我最近刚从使用BufferedReader s和PrintWriter s改为使用对象流。我很好奇为什么在这段代码中从来没有到达print语句。我已经尝试了一些事情,似乎在设置流之后的任何代码都无法访问。我知道客户端已经成功连接到服务器,因为我让它打印出连接用户的ip地址。下面是代码:

try {
    socket = new Socket (hostName, portNumber);
    sIn = new ObjectInputStream(socket.getInputStream());
    sOut = new ObjectOutputStream(socket.getOutputStream());
    while (true) {
        System.out.println("here2");
        String msg = "hi";
        sOut.writeObject(msg);
    }
}

问题是:为什么在这段代码中没有到达print语句

很可能是ObjectInputStream构造函数阻塞。

javadoc这样说:

"创建一个ObjectInputStream,从指定的InputStream中读取。从流中读取序列化流标头并进行验证。此构造函数将阻塞,直到相应的ObjectOutputStream写入并刷新标头。"

因此,除非服务器端立即打开相应的ObjectOutputStream并刷新流,否则客户端和服务器线程将死锁。

最简单的解决方案是,客户端和服务器应该在创建各自的ObjectInputStream之前创建并刷新它们各自的ObjectOutputStream

几乎可以确定你的问题是什么。ObjectInputStream将等待来自连接/输入流另一端的报头。它将"挂起",直到它被接收。

最新更新