2012-02-27 2 views
0

이것은 내 코드입니다. 제 2의 방법 (ReceiveMSG)을 알려주십시오. 왜 오류가 없습니까? 사실이 클래스는자바 스레드 및 소켓

가 실행 threadReceive의 두 가지 목적을 가지고 있기 때문에

왜이 코드는? 잘못하게하지 CLIENT1 연결 CLIENT2도 연결의 성공 이후 더 명확하게

, 왜이 코드를 오류가 아닙니다!

P. 미안해. 내 영어가 아주 가난하다..이게 내 첫 글. 영어 =


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를 읽어)을 만듭니다. 따라서 두 스레드는 각각 다른 소켓의 입력을 처리하는 병렬로 실행됩니다.

+0

안녕하세요, 왜 잘못하지! 스레드의 이름을 내 인 질문 두 객체가 동일 볼 주셔서 감사합니다 ... 그리고 대단히 답변 감사합니다! – Zillion