6

我现在感觉真的很愚蠢......基本上我在本地机器上通过 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();
        }
4

2 回答 2

6

从 ObjectInputStream 的规范

此构造函数将阻塞,直到相应的 ObjectOutputStream 已写入并刷新标头。

于 2011-10-01T19:30:25.520 回答
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();)

所以要小心服务器端发生的事情,也许问题不是你所期望的!

于 2013-07-06T18:34:08.883 回答