为什么客户端仅在关闭此TLS连接中的流后才获取消息?

时间:2017-06-02 09:19:51

标签: java sockets ssl

我正在尝试在本地网络上构建一个简单的TLS连接。只有在关闭输出流(out)后,客户端才会收到我正在尝试发送的消息。关闭输出流也会关闭套接字。另一个问题是客户端没有正确编码消息(他得到的东西就像& !y S} y。?'zn: zC£Cw8 J = RY)

我需要使用输入和输出流来回发送消息。

我使用了Oracle's website

中的[0]
KnockKnockProtocol

客户代码:

    ServerSocket serverSocket = new ServerSocket(PORT_NUMBER);
    Socket clientSocket = serverSocket.accept();

    TlsServerProtocol tlserver = new TlsServerProtocol(clientSocket.getInputStream(),
            clientSocket.getOutputStream(), new SecureRandom());


    tlserver.accept(new MyTlsServer(certificateData));

    try (

        // to send to client
        PrintWriter out = new PrintWriter(tlserver.getOutputStream(), true);
        // to receive from client
        BufferedReader in = new BufferedReader(new InputStreamReader(tlserver.getInputStream()));
        ) {


        String inputLine, outputLine;

        KnockKnockProtocol kkp = new KnockKnockProtocol();
        outputLine = kkp.processInput(null);
        out.println(outputLine);
        out.flush();
        out.close();

        while ((inputLine = in.readLine()) != null) {
            System.out.println("point 2");
            outputLine = kkp.processInput(inputLine);
            out.println(outputLine);
            if (outputLine.equals("Bye."))
                break;
        }


    }
    } catch (IOException e) {
        System.out.println(
                "Exception caught when trying to listen on port " + PORT_NUMBER + " or listening for a connection");
        System.out.println(e.getMessage());
    }


}

1 个答案:

答案 0 :(得分:1)

  

为什么客户端只在关闭此tls连接中的流后才收到消息?

因为客户端必须处于只在流的末尾终止的读循环,这只在对等端关闭连接时才会发生。如果您发布了客户端代码,那会有所帮助,但这是不可避免的。

  

问题是关闭输出流也会关闭套接字。

那不是问题'。这是way it works - Javadoc

  

另一个问题是客户端没有正确收到消息(编码有问题)

'编码的问题'?如果您遇到此类问题,请发布。但您发布的代码唯一可能发生的事件是SocketException: socket closed方法中的readLine()

  

我需要使用输入和输出流来回发送消息。

所以不要关闭它们,如果你不能得到它,就不要读到流的结尾。