我正在编写一个 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/