2012-02-27 13 views
0

これは私のコードです。私は2番目の方法(ReceiveMSG)なぜエラーではないことを教えてください?あまりにも接続されている接続CLIENT1の成功とCLIENT2後より明確にスレッドとソケットJavaの

このコードは間違ってしない理由は?実際には、このクラスがthreadReceive

の2つのオブジェクトが実行されている必要がありますので、なぜこのコードエラーではありませんか?

P.S.申し訳ありませんが私の英語は非常に貧しいです...これは私の最初のポストです記事=口= ||


public class Server{  
    String msgIN = null, msgOUT = "This is Server's respond."; 

    public Server(ServerSocket server){ 
     System.out.println("Server created.\nWaiting for client to connect..."); 
     while(!server.isClosed()){ 
      try { 
       Socket client = server.accept(); 
       System.out.println("Connect Prot:" + client.getPort()); 
       ReceiveMSG(client); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
    private void ReceiveMSG(final Socket socket) { 
     Thread threadReceive = new Thread(new Runnable() { 
      public void run() { 
       try { 
        while(socket.isConnected()){ 
         DataInputStream dataIN = new DataInputStream(socket.getInputStream()); 
         msgIN = dataIN.readUTF(); 
         if(!msgIN.isEmpty())RespondMSG(socket); 
        } 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 
     threadReceive.start(); 
    } 
    private void RespondMSG(final Socket socket){ 
     try { 
       DataOutputStream dataOUT = new DataOutputStream(socket.getOutputStream()); 
       dataOUT.writeUTF(msgOUT); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    public static void main(String[] args) throws Exception{ 
     ServerSocket server = new ServerSocket(5678); 
     new Server(server); 
    } 
} 

答えて

0

変数と実際のスレッドが混乱しているようです。新しい接続が受け入れられるたびに、まったく新しいスレッドが作成され、それを提供するためにコードが機能します。 threadReceiveはスレッドの名前ではなく、ローカル変数名です。これを使用してRunnableをカプセル化した新しいThreadを作成し、それを開始します。変数threadReceiveが有効範囲外になった後も、スレッドはバックグラウンドで実行されたままであり、影響を受けません。 10個の別のスレッドが作成され、開始され、threadという名前の同じローカル変数を使用して

public class ThreadTest 
{ 
    public static void main(String[] args) 
    { 
     for(int i = 0; i < 10; i++) 
     { 
      Thread thread = new Thread(new Runnable() 
       {     
        public void run() 
        { 
         System.out.println("Hello from thread " + 
          Thread.currentThread().getName()); 
        }     
       }); 
      thread.setName("MyThread-" + i); 
      thread.start(); 
     }  
    } 
} 

は、次の例を考えてみましょう。スレッドは並列で実行されますが、必ずしも作成と起動の順序で実行されるわけではありませんが、スコープから外れるローカル変数の影響を受けません。変数にnew Threadを代入しても、先に参照された変数のスレッドには影響しません。

Mr.Bogdanため
Hello from thread MyThread-1 
Hello from thread MyThread-3 
Hello from thread MyThread-8 
Hello from thread MyThread-9 
Hello from thread MyThread-0 
Hello from thread MyThread-4 
Hello from thread MyThread-2 
Hello from thread MyThread-7 
Hello from thread MyThread-6 
Hello from thread MyThread-5 
+0

ありがとうございました。とても役に立ちました!!!!!!!!! – Zillion

0

server.accept()(のServerSocketのJavadocを読んで)各接続のためのソケットの新しいインスタンスを作成します。したがって、2つのスレッドは、それぞれ異なるソケットからの入力を処理する並列に実行されます。

+0

こんにちは、なぜ間違ったことはありませ!スレッドの名前の私のquestion.But 2つのオブジェクトが同じである見てくれてありがとう...と非常にあなたの答えをありがとう! – Zillion