2016-11-29 8 views
0

私はサーバーとクライアントのコードを持っています。私のサーバーでは、接続と2つのスレッド(現在は2つのクライアント)を作成するのを待っています。ここに私のサーバーコードのスニペットがあります。Javaネットワーキングでスレッドに異なる値を渡す?

while (true) { 
      try { 
       Socket client = server.accept(); 
       int i; 
       for (i = 0; i < 2; i++) { 
        if(threads[i] == null) { 
         (threads[i] = new ClientThread(client, threads, i + 1)).start(); 
         break; 
        } 
       } 
       if(i == 2) { 
        PrintStream os = new PrintStream(client.getOutputStream()); 
        os.println("Server too busy. Try later."); 
        os.close(); 
        client.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

私のClientThreadクラスでは、このコンストラクタとメソッドを実行しています。

public ClientThread(Socket sock, ClientThread[] threads, int count) { 
      this.clientSocket = sock; 
      this.threads = threads; 
      this.count = count; 
     } // end constructor 

     public void run() { 
      ClientThread[] threads = this.threads; 

      try { 
       is = new DataInputStream(clientSocket.getInputStream()); 
       os = new DataOutputStream(clientSocket.getOutputStream()); 
       os.writeUTF("Hello client"+count); 
       System.out.println("Client sent =>"+ is.readUTF()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      for (int i = 0; i < 2; i++) { 
       if (threads[i] == this) { 
        threads[i] = null; 
       } 
       } 

      try { 
       is.close(); 
       os.close(); 
       clientSocket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } // end run method 

私はサーバーを実行しています。クライアントが接続されると、クライアントはいくつかの文字列を(countとともに)受け取って、これが出力されます。今度は別のクライアントが接続し、増分カウントを取得する必要があります。しかし、私は自分のコードを実行すると、サーバーが起動し、2つのクライアントを実行しても、最初のクライアントでは1、2番目のクライアントでは2の代わりに、カウントに対応する出力は1になります。 どこが間違っていますか?

編集: クライアントは、単純なソケットコードで、utfを読み込んでutfに書き込みます。それでおしまい。

答えて

0

あなたのプログラムは正しいと思います。なぜ出力がこのようなものかを理解しようとするだけです。 [0]あなたに応じて

Socket client = server.accept(); 

最初のクライアントのためのスレッド(のスレッドとしてそれを想定してみましょう:

前に、サーバがクライアントから送信されたデータを受け取り、このような状況を考えてみてコードは)あなたがスレッド化にnullを割り当てる意味し、その作業を終えた[0]:これが行われ

for (int i = 0; i < 2; i++) { 
    if (threads[i] == this) { 
     threads[i] = null; 
    } 
} 

した後、サーバは、送信されたデータを受け入れるようにしよう2番目のクライアントによって、ループ内のよう:

for (i = 0; i < 2; i++) { 
    if(threads[i] == null) { 
     (threads[i] = new ClientThread(client, threads, i + 1)).start(); 
     break; 
    } 
} 

thread[0]はまだnullあるとcountはまだ1であり、あなたがまだ出力として1を取得します。

提案:

... 
is = new DataInputStream(clientSocket.getInputStream()); 
os = new DataOutputStream(clientSocket.getOutputStream()); 
os.writeUTF("Hello client"+count); 
System.out.println("Client sent =>"+ is.readUTF()); 
TimeUnit.MILLISECONDS.sleep(100);// Add this line to simulate working 
... 
: あなたがあなたのコードを変更することができ、同時に動作する複数のスレッドをしたい場合
関連する問題