【发布时间】: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 握手是自动发生的,并且是同步的。摆脱握手代码,开始使用reader和writer。 --- 我的猜测是你自己陷入僵局。getInputStream()调用在初始同步握手完成之前不会返回,但初始握手未完成,因为HandshakeCompletedListener被调用为最后一步,并且永远不会返回。
标签: java android security ssl encryption