2011-09-14 9 views
2

connetion中にサーバーからデータを取得する必要がある場合は、Scannerオブジェクトを使用するのが良い方法があることを知っています。しかし、私は次のコードスニペットについて質問があります:接続が良好であること

public void sendMessage(String message) { 
    try { 
     OutputStream os = socket.getOutputStream(); 

     try { 
      byte[] buffer; 
      buffer = message.getBytes(); 
      os.write(buffer); 
     } finally { 
      os.close(); 
     } 

     InputStream is = socket.getInputStream(); 

     try { 
      StringBuffer data = new StringBuffer(); 
      Scanner in = new Scanner(is); 
      while (in.hasNext()) { 
       data.append(in.next()); 
      } 
      System.out.println(data.toString()); 
     } finally { 
      is.close(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

私はそれは私がサーバーにメッセージを送信した直後に起動するのでScannerは、InputStreamからデータを取得し、スニペットによって混乱しています。サーバーからのデータがメッセージを送信した後すぐにInputStreamに存在しないと仮定するのは公正でしょうか?

このような場合には、InputStreamからデータを読み取るための最良の方法は何ですか、私は何を考慮する必要がありますか?

答えて

1

によって呼び出されるInputStream.read()メソッドは、利用可能なデータがあるまでブロックします。したがって、サーバーの応答時間を心配する必要はありません。

参照:http://download.oracle.com/javase/6/docs/api/java/net/Socket.html#getInputStream()

+0

ありがとうございます!!!私は今理解している、ブロックモードとノンブロッキングモードについてさらにいくつかの情報を見つける必要がある。 – teoREtik

0

コードは無効です。それだけでは、ブロックせずに読み込めるように多くの入力が読み込まれます。読み込まれたものが完全なメッセージであることや、送信者などでの単一のwrite()呼び出しに対応するという意味はありません。TCP/IPでメッセージを使用するには、長さの単語接頭辞、オブジェクト直列化やXMLなどの自己記述型プロトコルなど

関連する問題