Java ObjectInputStream挂起

时间:2011-10-01 19:18:01

标签: java sockets tcp objectinputstream

我现在感觉真的很蠢....我基本上是在本地机器上连接TCP ...当我尝试在客户端制作输入/输出流时,它不会被传递创建对象输入流。是什么赋予了?打印后停止2 ...没有例外或任何事情......这不是我第一次使用这个课程,这也是我迷惑的原因。

try {
            System.out.println("1");
            mySocket = new Socket("localhost", 11311);
            System.out.println("12");
            oos = new ObjectOutputStream(mySocket.getOutputStream());
            System.out.println("2");
            ois = new ObjectInputStream(mySocket.getInputStream());
            System.out.println("13");

        } catch (Exception e) {
            e.printStackTrace();
        }

2 个答案:

答案 0 :(得分:6)

来自ObjectInputStream的specification

  

此构造函数将阻塞,直到相应的ObjectOutputStream为止   写了并刷了头。

答案 1 :(得分:1)

(对于未来的读者:)我有同样的问题,因为我在服务器程序中做了一个愚蠢的改变,并且没有测试很长一段时间然后我很困惑为什么程序被锁定。

ServerSocket接受连接(responderSocket = serverSock.accept();)然后突然接受一个不合适的if(我提到的愚蠢的改变!)程序跳出线程,因为我没有添加finally阻止关闭流和套接字,套接字被遗弃,无需发送或接收任何内容(甚至是流标题)。所以在客户端程序中没有流标题(当我调试代码时,我看到锁定之前执行的最后一个函数是:

public ObjectInputStream(InputStream in) throws IOException {
    verifySubclass();
    bin = new BlockDataInputStream(in);
    handles = new HandleTable(10);
    vlist = new ValidationList();
    enableOverride = false;
    readStreamHeader();                  //// <== This function
    bin.setBlockDataMode(true);
}

readStreamHeader();

所以要小心服务器端会发生什么,也许问题不在你期望的地方!