java - 多人 Java 游戏 - 通过 GUI 启动服务器时程序卡住

标签 java networking user-interface

我正在编写一个 Java GUI 多人游戏。 我有一个 GUI,用户可以在其中输入端口号并单击“启动服务器”,这将启动游戏服务器并弹出另一个 GUI 框架。但是当单击按钮时我的程序卡住了。 是否可以使用这种方式启动服务器,或者我如何编码以便启动服务器并等待玩家连接,同时显示另一个 GUI 框架(在单独的类中编写)?提前致谢。

// part of GUI code

start = new JButton ("Start Game Server");
        start.addActionListener (new ActionListener() {

            public void actionPerformed (ActionEvent event) {
                DEFAULT_PORT = Integer.parseInt(port.getText());
                fgServer.run();
                fgServerFrame = new FishingGameServerFrame();
                //frame.dispose();
            }
        });

--

// server code

public class FishingGameServer {

    private static int DEFAULT_PORT = 0;

    public void run()
    {

        int port = DEFAULT_PORT;

        port = Integer.parseInt(FishingGameConnectServerFrame.portNumber());
        System.out.println("port #: " + port);

        //setup server socket
        ServerSocket reception_socket = null;

        try {
            reception_socket = new ServerSocket (port);
            System.out.println("Started server on port " + port);
        }
        catch (IOException e) {
            //to get text in GUI frame
            System.out.println("Cannot create server");
            System.exit(0);
        }

        for (;;) {
            Socket client_socket = null;

            try {
                client_socket = reception_socket.accept();
                System.out.println("Accepting requests from:" + client_socket.getInetAddress());
            }
            catch (IOException i) {
                System.out.println ("Problem accepting client socket");
            }

            new FishingGameThreadedServer(client_socket);
        }
    }

    public static void main (String[] args) {

    new FishingGameServer().run();
    }

最佳答案

您调用fgServer.run();,它最终在无限循环内调用client_socket =reception_socket.accept();

这会阻止事件调度线程运行,因为阻塞(一旦在永无休止的 for 循环 内,一旦使用 accept 时)它就无法处理事件队列,除其他外,负责处理绘制请求。

Swing 是单线程环境,它也不是线程安全的。这意味着:

  • 您切勿在 EDT 上下文中执行任何长时间运行或阻塞的操作,并且
  • 所有更新以及与 UI 的交互都必须在 EDT 的上下文中进行

看看Concurrency in Swing了解更多详情

您可以使用Thread 代替,或者使用 SwingWorker它提供了更轻松地将更新发布回 EDT 的功能...

关于java - 多人 Java 游戏 - 通过 GUI 启动服务器时程序卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25638165/

相关文章:

java - 如何在 firebase 上获取节点名称?

java - 正则表达式匹配给定序列的空白、任何字符和/或换行符

java - 哪一个是 Integer i = 123; 的语法糖?

java - 通过 JSON 将 Android 应用程序连接到 PHP 服务器 : Socket Exception

c# - DataGridView 不在 ToolStripDropDown 中显示数据

.net - 有没有从Windows窗体中的自定义对话框返回值的标准方法?

java - Android 解析无法将子类列表固定到缓存

ubuntu - 使用 ros2 主题列表时可以看到主题,但无法通过网络回显?

python - 在套接字传输中接收额外字节

java - 具有排列的多个输入的 JOptionPane