我有一个使用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());

最佳答案

您必须在ObjectInputStream之前创建ObjectOutputStream。

编辑:请参阅下面的评论。真正的问题是SSL握手缓慢,这发生在套接字的第一个I/O中,在此期间执行读写操作。因此解决方案是设置读取超时。

关于java - ObjectOutputStream永久挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12642066/

10-11 04:38