2011-10-21 12 views
2

Javaを使用してソケットを学習しようとしていますが、自分のマシンで実行されているServerSocketにデータを正常に送信しました。 readlineを使ってこのソケットから読み込もうとすると(私は自分の送信したメッセージをエコーすることができます)、プログラムがハングして戻りません。BufferedReader readLineメソッドがハングしてプログラムをブロックします

は、ここでは、コードです:

public static void main(String[] args) throws UnknownHostException, IOException { 

    TCPClient cli = new TCPClient("127.0.0.1", "15000"); 
    try { 
     cli.ostream.writeUTF("Teste"); 
     String echo = cli.istream.readLine(); //it hangs in this line 
     System.out.println(echo); 
    } 

れるtcpClientは、私はので、私は私のhomweworkにスイングを使用する前に、シンプルなインターフェイスで、私のプログラムをテストすることができます定義されたクラスです。ここにコードがあります:

public class TCPClient { 

public DataOutputStream ostream = null; 
public BufferedReader istream = null; 

public TCPClient(String host, String port) throws UnknownHostException { 
    InetAddress ip = InetAddress.getByName(host); 

    try { 
     Socket socket = new Socket(host, Integer.parseInt(port)); 

     ostream = new DataOutputStream(socket.getOutputStream()); 
     istream = new BufferedReader(new InputStreamReader(socket.getInputStream())); 


    } catch (IOException ex) { 
     Logger.getLogger(TCPClient.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

私のサーバーはかなりシンプルです。接続が確立された後、このループに入り、(無限ループのために)クライアントを閉じるまでここにとどまります。その後、例外処理によって接続が開始される前の時点に戻ります。

  while(true){ 
       String msg = istream.readLine(); 
       System.out.println("Arrived on server: " + msg); //just works on debug 
       ostream.writeUTF("ACK: " + msg); 
       ostream.flush(); 
      } 

私は何が欠けているのか分かりません。

PS:サーバーをデバッグすると、そこに到着するメッセージが表示されます(たとえば印刷できます)。しかし、このコードを実行するだけではこれはできません。これは私が見落としているいくつかの同時実行関係を持っていますか?

THX

+1

サーバーは何をしていますか?あなたのメッセージに何も応答しない場合、またはその書き込みをフラッシュしない場合、もちろん、クライアントはサーバから回線が送信されるまで無期限に待機します。 –

+0

メッセージをエコーし​​ながらサーバの無限ループで投稿を編集します –

答えて

11

問題は、readLineが行を読み込もうとしています。行の終わりに達するまで、行を返すことはありません。これは改行文字か通信の終了を期待していることを意味します。サーバーは改行文字を送信せず、ストリームを閉じないため、クライアントは無期限に待機します。

+1

それだけです! ostream.writeUTF( "ACK:" + msg)に '\ n'を入れる;働いた。唯一疑いの余地は2つの印刷できない文字が私のクライアントに現れたことです。彼らは何ができますか? –

+0

一方の側でUTFで書き込み、もう一方の側でプラットフォームのデフォルトのエンコーディングを使用して読み込みます。常にライターを使用して文字を書きます。特定の明示的なエンコーディングを指定するOutputStreamWriterで常に出力ストリームをラップします。読み込みには同じ操作を行います。常にReaderを使用し、同じ特定のエンコーディングを指定するInputStreamReaderで入力ストリームをラップします。 –

+0

@Thiago Moraesこれは、Javadocに記載されているwriteUTF()によってそこに置かれた長さの単語接頭辞です。私の答えも見てください。 – EJP

1
cli.ostream.writeUTF("Teste"); 

が、これは新しい行を含むことではないでしょうか?さもなければ、私が考える新しい行を読み込むメソッドを待つでしょう。

また、ostreamを書き込んだ後に、そのストリームをフラッシュすることもできます。

+0

ostreamは出力ストリームです。 OPは、サーバーがこのメッセージを正しく受信したと述べています。問題は、クライアントがサーバーからの応答を受信しないことです。 –

+0

私はostreamを洗い流し、今すぐ私の文字列に '\ n'を追加しました。しかし、問題は同じままです。/ –

1

writeUTF()は行を書きません。 Javadocを参照してください。 writeUTF()はreadUTF()で使用するためのものです。読者はライターと一緒に使うことができます。 DataOutputStreamをBufferedWriterに変更し、write()を呼び出してからnewline()を呼び出します。

+0

私はあなたが言ったことを理解していると信じていますが、私はネイティブの英語話者ではないので、Unicodeサポートが必要です。私の場合に推奨されるクラスの組み合わせは何ですか? –

+0

@ThiagoMoraes私はタイプミスがありました。リーダとライタを使用し、文字セットを指定します。 – EJP

関連する問題