简体   繁体   English

握手后SSLSocket getOutputStream()阻塞

[英]SSLSocket getOutputStream() blocks after handshake

I am opening an SSLSocket on the client side to connect to the server. 我正在客户端打开一个SSLSocket以连接到服务器。 But trying to get the socket.getOutputStream() blocks the code, without outputting any errors. 但是尝试获取socket.getOutputStream()阻止代码,而不会输出任何错误。 I am flushing both streams, but it still doesn't work. 我正在刷新两个流,但仍然无法正常工作。

Server: 服务器:

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

Client: 客户:

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

You are misusing the handshake completed listener. 您正在滥用握手完成的侦听器。 Its purpose is to let to check he peer certificate, negotiated cipher suite, etc. Not to carry out the transaction. 其目的是让其检查对等证书,协商的密码套件等。不执行交易。 Remove it all and put it inline. 将其全部删除并内联。 You don't need even to call startHandshake() . 您甚至都不需要调用startHandshake() It will happen automatically on the first I/O. 它会在第一个I / O上自动发生。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM