2012-03-26 3 views
4

자바를 사용하여 멀티 스레드 서버/클라이언트 응용 프로그램을 만들려고합니다! 이 코드는 Bsocket (iserver.core.socket를)라는 이름의 패키지의 클래스() 메소드들을위한 것입니다 :Java - Socket.accept() freezes ui

try { 
    serverSocket = new ServerSocket(port); 
}catch(IOException e){ 
    ui.log(e.toString());//* 
} 
while (true){ 
    try{ 
     clienSocket = serverSocket.accept(); 
     ui.log("Incomming Connection.");//* 
     new connectionHandler(clienSocket, ui); 
    }catch(IOException e){ 
     ui.log(e.toString()); 
    } 
} 

ui.log("Incomming Connection.");이 Bgui의 메인 클래스의 아래의 방법이다 (iserver.core.ui) .Bgui는 textarea와 다른 것을 포함하는 jframe입니다! 문제는 accept 메소드가 실행될 때, ui.log이 작동하지 않는다는 것입니다. 여기 뭐가 잘못 됐니?

+0

질문은 완전히 알려드립니다! 하지만 일부 정보는 optinal입니다! 너 -1 좋아? :) 오케이! 'dty' 답변을보십시오! – bizzr3

+1

이 [SwingWorkers에 대한 자습서] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)를보아야합니다. – assylias

+0

Heh, 나는 당신을 알아 냈을 때 -1을 undid 시켰습니다. UI 시스템 작동 방식에 대해 몰랐습니다. 로그 출력과 jframes에 관해서는 혼란스러워합니다. – Gray

답변

4

사용자 고유의 네트워크 서비스 스레드에서 UI 스레드를 분리해야합니다. accept()가 블로킹 (분명히)하면 새 클라이언트를 얻을 때까지 응용 프로그램이 정지되고 더 많은 클라이언트를 기다리고 다시 고정됩니다.

+0

이 레이어를 분리하는 방법에 대해 자세히 알려주시겠습니까? – bizzr3

+1

이것은 정말 큰 반응을 보이는 짧은 질문입니다. 동시성에 대한 몇 가지 개념을 배워야합니다. UI 응용 프로그램을 개발하는 것은 매우 중요합니다. 오라클은 Swing 애플리케이션의 동시성과 관련된 몇 가지 흥미로운 튜토리얼을 제공합니다 (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). – logoff

+0

관심을 가져 주셔서 감사합니다. – bizzr3

6

Socket.accept() 수신 할 수신 연결이있을 때까지 차단됩니다 (설명서 참조). UI 스레드에서 차단 호출을해서는 안됩니다. 그렇지 않으면 ... 알다시피 ... 차단됩니다!

7

.accept이 차단 호출이기 때문에 서버를 별도의 스레드에서 실행해야합니다. 이 코드는 테스트되지 않지만, 그것은 당신에게 당신이해야 할 일의 아이디어를 줄 것이다 :

(new Runnable() { 
    @Override 
    public void run() 
    { 
     try { 
       serverSocket = new ServerSocket(port); 
      }catch(IOException e){ 
       ui.log(e.toString());//* 
      } 
     while (true){ 
      try{ 
       clienSocket = serverSocket.accept(); 
       ui.log("Incomming Connection.");//* 
       new connectionHandler(clienSocket, ui); 
      }catch(IOException e){ 
       ui.log(e.toString()); 
      } 
     } 
    } 
}).start(); 

참고 : 당신은 너무 같은 것을 수행 할 수 있습니다.