2011-12-19 13 views
2

私はjavaを学んでいて、ソケットに関するいくつかの問題に直面していました。私は、単純なクライアントサーバーアプリケーションを開発 - 種類のノックノック、それは4つのステップを実行します。ソケット、BufferedReader.readline() - ストリームが準備されていないのはなぜですか?

  1. クライアントは
  2. サーバーがクライアントに送り返すそれらをrecievesと
  3. サーバーをファイルに保存し、サーバーにいくつかのメッセージを送信しますいくつかの他のメッセージ
  4. クライアントがそれらをrecievesとも

問題は、ステップ#4に表示されるファイルに保存します。クライアントは、メッセージを受け取るていないし、ループを取得することはありませんん。

サーバー側のメッセージで

try { 
     socket = new Socket(ipAddress, 4444); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

が送信されます:中はBufferedReaderのタイプです

while ((inStr = in.readLine()) != null) { 
    writer.println(inStr); 
} 

try { 
     socket = srvSocket.accept(); 
     out = new PrintWriter(socket.getOutputStream(), true);   
     in = new BufferedReader(new InputStreamReader(socket.getInputStream()));     
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

...

out.println("test from server #1"); 
    out.println("test from server #2"); 

は、クライアント側で私はin.ready()を見て - falseを返します。サーバ側では、私はout.checkError()を見る - それは真を返します。

私は間違っていますが、なぜストリームは空ですか?

ヘルプiaが高く評価されました! :)

+0

例外がありますか? – Tudor

+0

行を書いた後に 'out.flush()'を試してください。 – nos

+0

@Sergio:あなたが言っているように、メッセージを送信しているサーバーコードはどこですか? –

答えて

-1

これは、あなたの問題を解決できない場合があります。しかし、Try Catchブロック内にすべてを保持してみてください。例:ServerSocketの初期化、ライターブロックなど。何らかのエラーが発生した場合は、ライターを使用することができない可能性があります。
 ファイルではなくデバッグ用の標準出力ストリームに書き込むことがあります。以下のServer/Clientのコードは、あなたとその作業の小さな変種です。

サーバー:

Socket socket; 
    ServerSocket srvSocket; 
    BufferedReader in; 
    PrintWriter out; 
    try { 
     srvSocket=new ServerSocket(4444); 
     socket = srvSocket.accept(); 
     out = new PrintWriter(socket.getOutputStream(), true);   
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     out.println("test from server #1"); 
     out.println("test from server #2"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

クライアント

Socket socket; 
    BufferedReader in; 
    PrintWriter out; 
    String inStr; 
    try { 
     socket = new Socket("127.0.0.1", 4444); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     while ((inStr = in.readLine()) != null) { 
      System.out.println(inStr); 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

これはありません。そして彼の元のコードはそれほど違いはありません。 – EJP

+0

@EJP私は同じコードを実行しています。私は私のコンソールで出力を取得しています。私は最初にサーバーを起動しています。クライアント – Sumit

+0

私はあなたの最初の文章を参照しています。例外処理ではなく、彼の問題を解決するのは 'println()'です。 – EJP

2

あなたは、新しい行またはprintlnに自動的にフラッシュされますpublic PrintWriter(OutputStream out, boolean autoFlush)を使用しています。 書き込みごとに自動フラッシュしません。書き込みが終わるたびにフラッシュする必要があります。

ここに、コンストラクタのautoFlushパラメータのjavadocがあります。 ブール値。 trueの場合、println,printfまたはformatのメソッドは出力バッファをフラッシュします

+0

ありがとう、println()の後にflush()しようとしました - 同じ結果を返します – Sergio

+0

私はループを[code] inStr = in.readline(); System.out.println(inStr); inStr = in.readline();ストリームから2行を読み込むためにSystem.out.println(inStr); [/ code] – Sergio

関連する問題