-1
クライアント側でSSLSocketを開いてサーバーに接続しようとしています。 しかし、エラーを出力せずにsocket.getOutputStream()
がコードをブロックしようとしています。 両方のストリームをフラッシュしていますが、それでも動作しません。ハンドシェイク後のSSLSocket 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()'は何ですか? *初期*ハンドシェイクは自動的に起こり、同期します。そのハンドシェイクコードを取り除き、 'reader'と' writer'を使い始めましょう。 ---私の推測*は、自分がデッドロックしているということです。 'getInputStream()'呼び出しは、最初の同期ハンドシェイクが完了するまで戻りませんが、 'HandshakeCompletedListener'が最後のステップとして呼び出されるため、最初のハンドシェイクは完了せず、返されません。 – Andreas