我正在尝试在本地网络上构建一个简单的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());
}
}
答案 0 :(得分:1)
为什么客户端只在关闭此tls连接中的流后才收到消息?
因为客户端必须处于只在流的末尾终止的读循环,这只在对等端关闭连接时才会发生。如果您发布了客户端代码,那会有所帮助,但这是不可避免的。
问题是关闭输出流也会关闭套接字。
那不是问题'。这是way it works - Javadoc。
另一个问题是客户端没有正确收到消息(编码有问题)
'编码的问题'?如果您遇到此类问题,请发布。但您发布的代码唯一可能发生的事件是SocketException: socket closed
方法中的readLine()
。
我需要使用输入和输出流来回发送消息。
所以不要关闭它们,如果你不能得到它,就不要读到流的结尾。