2017-11-03 5 views
0

DatagramSocket UDP 서버/클라이언트 채팅 응용 프로그램을 만들려고했지만 DatagramPacket으로 패킷을받은 후 GUI를 업데이트하는 데 문제가 있습니다. 여기 내 코드가있다. 내 생각에 부적절하다고 생각한 유일한 예외는 내 JFrame 윈도우에 대한 그루 빙 코드였습니다.DatagramSocket UDP 서버 스윙 InvokeLater가 작동하지 않음

public class Server extends JFrame { 

    JButton startServerButton; 
    JTextField textField; 
    JTextArea textArea; 

    public Server() { 

     super("Server"); 
     initComponents(); 
     setResizable(false); 
     setVisible(true); 

    } 

    private void startServer() throws IOException { 

     DatagramSocket serverSocket; 
     String sentence; 

     startServerButton.setText("Server started"); 
     startServerButton.setEnabled(false); 

     while (true) { 

      serverSocket = new DatagramSocket(9876); 

      // receive 
      byte[] receiveData = new byte[1024]; 
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
      serverSocket.receive(receivePacket); 
      sentence = new String(receivePacket.getData()); 
      int port = receivePacket.getPort(); 
      System.out.println("RECEIVED (port " + port + "): " + sentence); 
      showMessage("RECEIVED (port " + port + "): " + sentence); 
      InetAddress IPAddress = receivePacket.getAddress(); 

      // send 
      byte[] sendData = sentence.getBytes(); 
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); 
      serverSocket.send(sendPacket); 
      serverSocket.close(); 

     } 

    } 

    private void showMessage(final String text) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       textArea.append("\n" + text); 
      } 
     }); 
    } 

    private void initComponents() { 

     startServerButton = new JButton(); 
     textField = new JTextField(); 
     textArea = new JTextArea(); 
     textArea.setEditable(false); 



     startServerButton.setText("Start server"); 
     startServerButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       try { 
        startServer(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 


     ...grouplayout stuff here... 


    } 

    public static void main(String args[]) { 
     Server server = new Server(); 
    } 

} 

그래서 문제는 내 JFrame의에 텍스트 영역이 업데이트되지 없구요,하지만 내 System.out.println() 항상 인쇄가 제대로 메시지가 내 클라이언트 클래스에서 받았다. 내 Client 클래스의 코드를 보여줄 수는 있지만 관련이 없다고 느꼈습니다. 고마워. 고마워.

+0

왜 작성 및 루프 주위 소켓마다 시간을 닫는? 그렇게 메시지를 놓칠 수 있습니다. – EJP

답변

2

다른 스레드에서 소켓 수신기를 시작해야합니다. 그렇지 않으면 다시 그리기를 차단합니다. 이 같은

뭔가 :

startServerButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     Thread t = new Thread(new Runnable() { 
      public void run() { 
       try { 
        startServer(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     t.start(); 
    } 
}); 
+0

이제 완벽하게 작동합니다. 스레드에 넣는 방법을 살펴 보았지만 버튼 클릭을위한 ActionListener가 아닌'startServer()'함수에서 보았습니다. 감사! – Jacob