2013-10-24 3 views
0

누군가가이 prob로 나를 도울 수 있기를 바랬습니다. 두 개의 클라이언트 스레드가 깨어날 때까지 GUI JFrame이 구성 요소를 표시하지 않는 다중 스레드 서버 응용 프로그램이 있습니다. 각 클라이언트는 내부 클래스 ext 스레드로 작성된 스레드입니다.JFrame은 2 개의 스레드가 깨어날 때까지 구성 요소를 표시하지 않습니다.

하나의 클라이언트가 소켓 연결을 통해 조인되고 스트림이 설정되고 클라이언트 2가 조인 될 때까지 일시 중단됩니다. 클라이언트 스레드가 설정되고 스트림이 생성되면 클라이언트 1은 일시 중단 (false)으로 설정되고 두 클라이언트 스레드는 깨어납니다.

public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Runnable(){ 

     @Override 
     public void run() { 
       MorseCode_Server serverApp= new MorseCode_Server(); 
       serverApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    serverApp.execute(); 

     } 

확실하지 내가이 추가, 그래서 여기에 관련된 어떤 코드 : 이 방법은 처음입니다 만 지금 JFrame의 디스플레이 구성 요소 ....

주요 방법은 또한 동부 서머 타임에 호출을한다 방법은 외부 클래스에서 호출하기 위해서는 각 클라이언트/플레이어를 위로 설정하고 2가 준비 될 때까지 첫 번째 스레드를 일시 중단 :

displayMessage("Execute Called(): "); 
    for (int i = 0; i < players.length; i++) { 
     try { 
      players[i] = new Player(socket.accept(), i);//assign soc & playerNumber 
      //clientIP[i] = //get IP address for message log 
      players[i].start();//JVM calls the threads run method 
      displayMessage("Execute(): Player " + players[i] + " socket created in execute (OUTER CLASS)"); 
      //get IP address of playet[i] 


     } catch (IOException e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    }//end for 
    //player 0 is suspended once socket created until player 1 is instantiated 
    //must retrun player 0 to resume state in synchronised block to allow one 
    //thread access at a time 
    synchronized (players[0]) { 
     players[0].setSuspended(false); 
     players[0].notifyAll();//wake up threads waiting on this object 
     displayMessage("Execute(): "+ players[0] + " players number notifyAll called in execute"); 
    }//end synchronised block 

이 각 클라이언트 스레드에 대한 내부 클래스의 생성자 :

나는 그것의 연결을 통해 clicent의 IP 주소를 얻을 때 16,
private class Player extends Thread { 
    //instance varibles for each client/player 
public Player(Socket accept, int i) { 
     connection = accept; 
     //clientIP[i] = connection.getRemoteSocketAddress().toString(); 
     playerNumber = i; 
     displayMessage("Player " + playerNumber + " costructor thread inner class called"); 
     //open socket streams for communication 
     try { 
      //objectouptstream obj wraps the low level code from getOutputStream method 
      output = new ObjectOutputStream(connection.getOutputStream()); 
      output.flush(); 
      input = new ObjectInputStream(connection.getInputStream()); 
      displayMessage("Player " + playerNumber + " output/input streams set up in Player inner class..END CONSTRUCTOR PLAYER"); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 



    }//end constructor inner class Player 

또한 :

clientIP[i] = connection.getRemoteSocketAddress().toString(); 

나는 널 포인터 예외를 얻을! 사전에 건배 C

+0

여기서'clientIP [i] = ...'명령은 무엇입니까? –

+0

이제 플레이어 생성자에 있습니다. 이제 정렬 된 것입니다. 그냥 문자열 배열을 intilised하지 않았습니다. – dancingbush

답변

2

EDT (Event Dispatch Thread)에서 장기 실행 코드를 실행하지 마십시오. 이로 인해 GUI가 중단되었습니다.

소켓 연결을 시작하는 코드는 EDT를 차단하지 않도록 별도의 스레드에서 실행해야합니다. 자세한 내용은 Concurrency에있는 스윙 튜토리얼의 섹션을 읽어보십시오. 자신 만의 Thread를 만들거나 SwingWorker를 사용할 수 있습니다.

+0

건배, 스 워커 스레드에서 첫 번째 실행 메서드 (bew 클라이언트 스레드를 만들고 중단합니다)를 래핑 해보십시오 ... – dancingbush

+0

완벽하게 일했습니다. 감사합니다. – dancingbush

관련 문제