【问题标题】:SSLSocket getOutputStream() blocks after handshake握手后 SSLSocket getOutputStream() 阻塞
【发布时间】:2017-10-12 23:35:20
【问题描述】:

我正在客户端打开一个 SSLSocket 以连接到服务器。 但是尝试获取 socket.getOutputStream() 会阻止代码,而不会输出任何错误。 我正在刷新两个流,但它仍然不起作用。

服务器:

        SSLSocket socket = (SSLSocket) serverSocket.accept();
        socket.setUseClientMode(false);
        try{
        socket.setSoTimeout(0);
        socket.setKeepAlive(true);
        socket.addHandshakeCompletedListener(handshakeCompletedEvent -> {
            try{
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                writer.println("Setup"); writer.flush();

                while(running){
                    if(!socket.isConnected() || socket.isClosed()){
                        disconnect();
                        return;
                    }
                    for(Iterator<String> pendingIterator = pendingMessages.iterator(); pendingIterator.hasNext();){
                        String message = pendingIterator.next();
                        pendingIterator.remove();
                        writer.println(message); writer.flush();
                    }

                    //Auto decrypt when message arrives, but no thread blocking
                    if(reader.ready()){
                        String line = reader.readLine();
                        System.out.println(line);
                    }
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        });
        socket.startHandshake();
    }catch(Exception e){
        e.printStackTrace();
        disconnect();
    }

客户:

            socket.addHandshakeCompletedListener(new HandshakeCompletedListener(){
            @Override
            public void handshakeCompleted(HandshakeCompletedEvent handshakeCompletedEvent){
                try{
                    Log.i("Update", "Did handshake");

                    writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                    writer.flush();
                    Log.i("Update", "Writer");
                    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    Log.i("Update", "Reader");

                    while(isRunning){
                        try{
                            writer.println("Test");
                            writer.flush();
                            Log.i("DATA", "DATA SENT");
                        }catch(Exception e){
                            e.printStackTrace();
                        }
                    }

                    writer.close();
                    reader.close();
                    socket.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        });
        socket.startHandshake();

【问题讨论】:

  • 为什么要搞那些startHandshake() / addHandshakeCompletedListener() 的东西? initial 握手是自动发生的,并且是同步的。摆脱握手代码,开始使用readerwriter。 --- 我的猜测是你自己陷入僵局。 getInputStream() 调用在初始同步握手完成之前不会返回,但初始握手未完成,因为 HandshakeCompletedListener 被调用为最后一步,并且永远不会返回。

标签: java android security ssl encryption


【解决方案1】:

您正在滥用握手完成的侦听器。其目的是让他检查对等证书、协商密码套件等。不进行交易。将其全部删除并内联。你甚至不需要打电话给startHandshake()。它会在第一次 I/O 时自动发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2019-04-20
    • 2017-12-17
    • 1970-01-01
    • 2018-03-04
    • 2013-06-11
    相关资源
    最近更新 更多