Java DatagramSocket UDP服务器Swing调用器不工作

Java DatagramSocket UDP服务器Swing调用器不工作,java,swing,invokelater,Java,Swing,Invokelater,试图创建DatagramSocket UDP服务器/客户端聊天应用程序,但在收到带有DatagramPack的数据包后,在更新GUI时遇到一些问题。这是我的密码;我唯一遗漏的,我认为是无关的,是我的JFrame窗口的grouplayout代码 public class Server extends JFrame { JButton startServerButton; JTextField textField; JTextArea textArea; publ

试图创建DatagramSocket UDP服务器/客户端聊天应用程序,但在收到带有DatagramPack的数据包后,在更新GUI时遇到一些问题。这是我的密码;我唯一遗漏的,我认为是无关的,是我的JFrame窗口的grouplayout代码

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()
始终正确打印从客户端类收到的消息。我可以为我的客户机类显示代码,但我觉得它无关紧要。非常感谢您的帮助,谢谢。

您必须在另一个线程中启动套接字侦听器。否则,您将阻止重新绘制

大概是这样的:

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();
    }
});

您必须在另一个线程中启动套接字侦听器。否则,您将阻止重新绘制

大概是这样的:

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();
    }
});

为什么每次在循环中都要创建和关闭套接字?这样肯定会错过消息。为什么每次循环时都要创建和关闭套接字?你肯定会错过这样的信息。现在效果很好,亲爱的!我试图将它放入一个线程中,但是在
startServer()
函数中,而不是在
ActionListener
中单击按钮。谢谢现在很好用,甜心!我试图将它放入一个线程中,但是在
startServer()
函数中,而不是在
ActionListener
中单击按钮。谢谢