2013-09-03 96 views
6

Javaで基本的なクライアントサーバープログラムを作成しました。それはこのようにアウトを開始:Javaソケット:1つのサーバーと複数のクライアント

  1. クライアントは
  2. Serverは名前
  3. Serverは、この後にクライアント
  4. に挨拶して、クライアントの名前
  5. クライアントが応答するために、クライアントが話し、サーバーが繰り返される尋ねるServerに接続します言葉戻る

this tutorialを使用するとあまり問題なく動作するようになりました。この問題は、複数のクライアントを導入しようとするたびに発生します。私は、複数のスレッドを使用しているので動作すると思っていましたが、2番目のクライアントは、最初のクライアントが終了してから動作するまでハングします(サーバは2番目のクライアントからの入力を受け付けますが、最初のクライアントが終了するまで)。

import java.net.*; 
import java.io.*; 

public class Server extends Thread { 
    private ServerSocket listener; 

    public Server(int port) throws IOException { 
    listener = new ServerSocket(port); 
    } 

    public void run() { 
    while(true) { 
     try { 
     Socket server = listener.accept(); 
     DataOutputStream out = new DataOutputStream(server.getOutputStream()); 
     out.writeUTF("What is your name?"); 
     DataInputStream in = new DataInputStream(server.getInputStream()); 
     String user_name = in.readUTF(); 
     out.writeUTF("Hello "+user_name); 
     while(true) { 
      String client_message = in.readUTF(); 
      out.writeUTF(client_message); 
     } 
     } 
     catch(IOException e) { 
     e.printStackTrace(); 
     } 
    } 
    } 

    public static void main(String[] args) { 
    int port = 6006; 
    try { 
     Thread t = new Server(port); 
     t.start(); 
    } catch(IOException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

を誰かが私が間違ってやっているかを説明することはできます:ここで

は、私が使用しているコードのですか?

私は拡張スレッドの代わりにRunnableを見ましたが、さらに問題が発生しましたので、まずこれを試してみたいと思います。

+0

ここにはマルチスレッドはありません。 – Cruncher

+0

listener.accept()の後のすべては、スレッドを拡張するか、または実行可能メソッドを実装する別のクラスにある必要があります。その時点でそのスレッドを開始すると、ループは次の接続を受け入れます。 – Cruncher

答えて

4

着信接続は、listener.accept();という行でのみ処理されます。しかし、クライアントを接続した後、あなたはwhileループに陥ります。新しいThread(または、負荷が大きいと思われる場合はで実行されるRunnable)を作成して起動し、次にに次の接続を受け入れる必要があります。

+1

つまり、新しいスレッドを作成し、実行しないで「開始」します。 –

+0

@AlexeiKaigorodov確かに誤解しやすく、その言葉を編集しました。 – dst

3

要するに、これは間違っています。

  1. サーバーとして1つのスレッドしか使用していません。
  2. あなたがlistener.accept(呼び出すときにこのスレッドをブロック

これは、あなたが何をする必要があるかです:サーバー - あなたが今持っているものに似ていますが、代わりに:

は、2つのクラス 1を作成します。エコーサーバとして機能する実際の作業を行うだけで、新しいPORT(ランダムに選択できる)をリッスンする新しいスレッドが生成され、この新しいポートのアドレスがクライアントに送信されます。クライアントは新しいポート番号を取得し、新しいポートのサーバーに接続しようとします。 2:エコースレッド - これは、渡されたポートで新しいリスナーを開始し、リッスンしている人にエコーする作業を行います。

OR:

あなたはUDPサーバーではなく、TCPサーバーを起動し、そしてこのすべては、重要ではないでしょうが、それは、この特定の質問の範囲外です。

関連する問題