2017-05-13 8 views
-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(); 
+2

なぜ、すべての 'startHandshake()'/'addHandshakeCompletedListener()'は何ですか? *初期*ハンドシェイクは自動的に起こり、同期します。そのハンドシェイクコードを取り除き、 'reader'と' writer'を使い始めましょう。 ---私の推測*は、自分がデッドロックしているということです。 'getInputStream()'呼び出しは、最初の同期ハンドシェイクが完了するまで戻りませんが、 'HandshakeCompletedListener'が最後のステップとして呼び出されるため、最初のハンドシェイクは完了せず、返されません。 – Andreas

答えて

2

あなたはリスナーを完了したハンドシェイクを悪用されています。その目的は、ピア証明書、交渉された暗号スイートなどをチェックすることです。トランザクションを実行しません。それをすべて取り除き、インラインで入れてください。 startHandshake()に電話する必要はありません。最初のI/Oで自動的に発生します。

関連する問題