2012-02-27 3 views
0

Это мой код. Пожалуйста, скажите мне второй метод (ReceiveMSG), почему бы не ошибка?Thread and Socket в Java

более ясно, после успеха client1 подключен и client2 подключен тоже,

почему этот код не сделать так? Потому что на самом деле этот класс имеет два объекта threadReceive

бежит, почему этот код не ошибка ?!

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 - это имя локальной переменной, а не имя потока. Вы используете его для создания нового Thread, инкапсулирующего ваш Runnable, а затем запустите его. После того, как переменная threadReceive выходит за пределы области действия, поток по-прежнему остается в фоновом режиме, на него это не повлияет.

Рассмотрим следующий пример:

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(); 
     }  
    } 
} 

Используя ту же локальную переменную с именем thread, 10 отдельных потоков создан и запущен. Потоки выполняются параллельно, и не всегда даже в порядке создания и запуска, но не затрагиваются локальной переменной, выходящей из области видимости. Присвоение переменной new Thread переменной не влияет на Thread, на которую ссылается ранее.

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() создает новые экземпляры сокета для каждого соединения (читать Javadoc для ServerSocket). Таким образом, два потока будут запускаться параллельно, каждый из которых обрабатывает входные данные из другого сокета.

+0

Привет для Mr.Bogdan, спасибо за просмотр моего question.But два объекта от имени потока одно и то же! Почему бы не сделать так ... и спасибо вам ваш ответ очень много !! – Zillion