【问题标题】:ObjectOutputStream hanging foreverObjectOutputStream 永远挂起
【发布时间】:2012-09-20 11:02:24
【问题描述】:

我有一个使用 SSLSocket 连接到服务器的客户端。接下来,我尝试用ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getOutputStream());创建一个OOS

如果服务器端一切正常,这很好。但是,我想在我的客户端放置一些东西来尝试创建 ObjectOutputStream,但如果它在 60 秒内没有发生,请记录错误并继续处理。我没有看到任何超时选项。有什么例子可以说明如何做到这一点?

     SSLSocket sslsocket;
     try {
            System.setProperty("javax.net.ssl.trustStore", <myKeystore>);
            System.setProperty("javax.net.ssl.trustStorePassword", <myPW>);
            SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
            sslsocket = (SSLSocket) sslsocketfactory.createSocket(InetAddress.getLocalHost(), <myPort>);

     } catch (Throwable e) {
            logger.logError(e.getMessage());
            return null;
     }

      // This is where it hangs forever
      ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getOutputStream());
      oos.flush(); // never gets here
      oos.writeObject(orders);

      ObjectInputStream ois = new ObjectInputStream(sslsocket.getInputStream());

【问题讨论】:

    标签: java sockets outputstream objectoutputstream


    【解决方案1】:

    您必须在 ObjectInputStream 之前创建 ObjectOutputStream。

    编辑:见下面的 cmets。真正的问题是缓慢的 SSL 握手,它发生在套接字上的第一个 I/O 中,在此期间执行读取和写入一样。所以解决办法是设置读取超时。

    【讨论】:

    • @PeterLawrey 你不必刷新,它发生在内部。他根本没有理由需要暂停,它会立即发生。
    • @EJP,你是什么意思?我看到当服务器无响应时,oos 的创建会永远挂起
    • 我的问题是连接永远挂起。在我的项目的更大方案中,如果服务器端出现我无法控制的问题,我想包括某种超时
    • @Marianna 我怀疑你看到的是 ObjectInputStream 挂起的创建。输出流没有理由挂起,它全部进入套接字发送缓冲区,无需等待。
    • 我添加了代码和一些关于我在哪里得到的 cmets。我输入了打印语句,这样我就可以知道它击中了哪些行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多