2010-02-18 6 views
0

2 개의 포트에서 동시에 수신 대기하는 멀티 스레드 응용 프로그램을 구축 중입니다. 이 작업을 수행하는 방법은 다음과 같습니다. 나는 PortApp.java에서 매우 기본적인 GUI를 가지고 있는데,이 GUI는 2 개의 텍스트 필드를 통해 2 개의 정수를 취하고 또한 청취 버튼을 가지고있다. 따라서 듣기 버튼을 클릭하면 다음 코드가 실행됩니다.Java 소켓 스레딩 문제

public void foo(int a, int b){ //function to get the port numbers as integers and to declare 2 sockets for the ports. 
    int port=a; 
    int port1=b; 
    int count=0; 

    try { 
     socket1 = new ServerSocket(port); 
    } catch (IOException ex) { 

    } 

    try { 
     socket2 = new ServerSocket(port1); 
    } catch (IOException ex) { 

    } 
    //System.out.println("MultipleSocketServer Initialized"); 
    Runnable runnable = new MultipleSocketServer(socket1, ++count); 
    Runnable run = new MultipleSocketServer(socket2, ++count); 
    thread = new Thread(runnable);         
    thread1 = new Thread(run); 
    } 
socket1 및 socket2가 ServerSocket의 인스턴스이다

다음과 같이

jTextField1.disable();      

    jTextField2.disable(); 

    int port = Integer.valueOf(jTextField1.getText());  
    int port1 =Integer.valueOf(jTextField2.getText()); 
    int count = 0; 

      try{ 

    foo(port,port1);              
    while (true) { 
    //Socket connection = socket1.accept(); 

    thread.start();  
    thread1.start(); 
    } 
} 


catch (Exception e) {} 

상기 방법의 푸()이다. 그런 다음 컨트롤은 일단 소켓이 설정되면 intback이 다른 백엔드 작업을 수행하는 다른 클래스 인 MultipleSocketServer로 전송합니다.

public void run() { 
while(true){ 


    try { 

     Socket incoming=connection.accept();   
BufferedInputStream is = new BufferedInputStream(incoming.getInputStream());  
      int character; 
while((character = is.read())!=-1) {      

//DO SOMETHING 
} 
incoming.close(); 
SYstem.out.println("Client DC'ed"); 
//CONTINUE WITH OTHER EXECUTIONS 
    } 

을 다음과 MultipleSocketServer의 생성자가

MultipleSocketServer(ServerSocket s, int i) { 
    this.connection = s; 
    this.ID = i; 
} 

지금 위의 리스너 코드가 동시에 여러 클라이언트를 지원하지 않습니다으로

런은() MultipleSocketServer 클래스입니다. 그리고 '많은 수의 동시 접속 된 동일한 포트'클라이언트 중 하나가 연결을 끊을 때마다 '능동적 인 DC 프롬프트 메시지'를 인쇄해야한다고 생각했지만 이것이 발생하지 않는 것처럼 보일 때까지 프롬프트를 인쇄하지 않습니다. 마지막 클라이언트가 해당 포트 인스턴스에 연결되고 클라이언트가 연결 해제되면 모든 클라이언트의 프롬프트 메시지가 인쇄됩니다. 따라서 특정 클라이언트가 연결을 끊더라도 가장 마지막 클라이언트가 연결을 끊을 때까지 해당 클라이언트에 해당하는 propmt 메시지가 인쇄되지 않으므로 소켓이 '비어있게됩니다. 이 문제를 해결하고 동시에 연결된 클라이언트 중 하나가 연결을 끊을 때까지 기다리지 않고 연결을 끊는 방법을 알려주는 포인터는 큰 도움이됩니다.

참고로 여러 하이퍼 터미널 인스턴스를 사용하여 위의 환경을 시뮬레이션하고 있습니다.

키즈

답변

0

AWT 스레드에서 네트워킹 코드를 실행하지 마십시오. actionPerformed() 메소드에서. 별도의 스레드를 사용하십시오.

1
while (true) { 
    //Socket connection = socket1.accept(); 

    thread.start();  
    thread1.start(); 
    } 
} 


catch (Exception e) {} 

모든 예외를 포착하거나 삼키지 마십시오. 또한 스레드가 처리되지 않은 예외를 발견하면 간단히 종료됩니다. while 루프에서는 스레드 예외를 catch하지 않습니다.
스레드 개체를 다시 사용할 수 없습니다. run() 메서드가 완료되면 start()를 다시 호출 할 수 없습니다. 새 스레드를 만들어야합니다 (가능한 경우 동일한 실행 가능 파일로). 또한 변수 이름을 설명 적으로 만들면 변수 이름을 향상시킬 수 있습니다.