Try Block中的Java无法访问代码

时间:2014-05-05 23:34:55

标签: java try-catch inputstream outputstream

我正在使用与服务器通信的聊天客户端。我最近刚刚使用BufferedReaderPrintWriter更改为使用对象流。我很好奇为什么在这段代码中永远不会达到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语句。

2 个答案:

答案 0 :(得分:2)

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

javadoc说:

  

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

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

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

答案 1 :(得分:1)

几乎可以肯定你的问题是什么。 ObjectInputStream将等待连接/ inputStream另一端的头。它会"挂起"直到收到