【问题标题】:Java ObjectInputStream hangingJava ObjectInputStream 挂起
【发布时间】:2011-10-01 19:18:01
【问题描述】:

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

【问题讨论】:

  • 服务器发送对象了吗?似乎服务器没有发送任何内容。
  • ObjectInputStream 可能正在等待接收流标头。
  • 我没有关注...服务器接受 TCP 连接。我想读你会去ois.readObject()?我已经设置好了,所以客户端发送了第一个对象......我只是想创建流。

标签: java sockets tcp objectinputstream


【解决方案1】:

来自ObjectInputStream的specification

这个构造函数会阻塞,直到对应的 ObjectOutputStream 已写入并刷新标题。

【讨论】:

    【解决方案2】:

    (对于未来的读者:)我遇到了同样的问题,因为我对服务器程序进行了愚蠢的更改并且很长时间没有对其进行测试,然后我对为什么程序被锁定感到困惑。

    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();)

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

    【讨论】:

    • 你不应该首先在 accept() 循环中构造对象流。您应该在连接处理线程的 run() 方法中构造它们。否则,您将面临阻塞流标头的 I/O 上的 accept() 循环的风险,这将阻塞更多的客户端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2017-09-16
    • 2014-11-01
    相关资源
    最近更新 更多