2017-11-03 5 views
0

DatagramSocket UDPサーバー/クライアントチャットアプリケーションを作成しようとしていますが、DatagramPacketでパケットを受信した後にGUIを更新するのに問題があります。ここに私のコードです。私が残した唯一のことは、私が無関係だったと思ったのは、私のJFrameウィンドウ用のgrouplayoutコードでした。DatagramSocket UDP Server Swing 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の上にtextAreaが更新されることは決してありませんが、私のSystem.out.println()は常に正しく、私のクライアントクラスから受信したメッセージを出力します。私はクライアントクラスのコードを表示することができますが、それは無関係だと感じました。助けていただければ幸いです。

+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

関連する問題