SSLSocket getOutputStream() 在握手后阻塞



我正在客户端打开一个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().它将在第一个 I/O 上自动发生。

最新更新