2011-10-17 4 views
0

小さなプログラムを作成しようとしています。サーバーを開き、このサーバーに接続してそこからメッセージを受信するクライアントを作成します。ServerとServerSocketが1つのアプリケーションで動作していません。

これは私がプログラムを実行する場合は、()のreadLineで待ち続ける、これまで

public static void main(String[] args) { 
final ServerSocket serverSocket; 
try { 
    serverSocket = new ServerSocket(12345); 
    Thread t = new Thread(){ 
     public void run(){ 
       try { 
        Socket server = serverSocket.accept(); 
        PrintWriter writer = new PrintWriter(server.getOutputStream(), true); 
        writer.write("Hello World"); 
        writer.flush(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     t.start(); 
     Socket client = new Socket("localhost", 12345); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     String message = reader.readLine(); 

     System.out.println("Received " + message); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

} 

コードである - そう、明らかにクライアントがサーバからメッセージを受信しません。 誰かがこれがなぜうまくいかないのか考えていますか?

答えて

3

読み取りスレッドがデータストリームの改行を待っています。サーバを使用するように変更してください:

writer.write("Hello World\r\n"); 

あなたが期待していた結果が得られます。または、サーバーソケットを閉じるだけで、readLineがデータストリームの最後に到達すると返されます。次のように、ループ内でのreadlineを置くべき

+0

ベター:変更 'writer.write( "Hello Worldの");' 'writer.println(" Hello World ");' –

+0

@RyanStewart:おそらく。個人的には、コードをプラットフォームのデフォルトにあまり依存しないようにすることを好みます。ネットワークプロトコルに関しては、サーバがWindowsを実行しているのか、Unixがあるのか​​は関係ありません。 –

+0

私はあなたの選択がMac上でうまくいかないと思うが、真実だ。生産上の価値が懸念される場合、答えは、正確な理由から 'reader.readLine()'を使わないことです。しかし、この例は全く違った方向性を持っています。 –

0

public static void main(String[] args) { 
    final ServerSocket serverSocket; 
    try { 
     serverSocket = new ServerSocket(12345); 
     Thread t = new Thread() { 
      public void run() { 
       try { 
        Socket server = serverSocket.accept(); 
        PrintWriter writer = new PrintWriter(server.getOutputStream(), true); 
        writer.write("Hello World"); 
        writer.flush(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     t.start(); 
     Socket client = new Socket("localhost", 12345); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      // Check this ---------------------------------------------------> 
      String message = null; 
      while ((message = in.readLine()) != null) { 
        System.out.println("Received " + message); 
        break; //This break will exit the loop when the first message is sent by the server 
      } 

    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

} 

あなたは、さらなる説明のために、このドキュメントを読むことができます。http://download.oracle.com/javase/tutorial/networking/sockets/

+1

それは実際には問題を全く扱っていません。 –

関連する問題