【发布时间】:2011-04-07 23:40:29
【问题描述】:
我正在尝试编写一个支持网络多人游戏的游戏服务器。
我试图实现的是一个服务器,它在循环中侦听连接并为每个客户端设置一个线程。它应该这样做,直到游戏主机点击开始游戏,然后它应该继续游戏逻辑,发送数据等。
为了实现这一点,我在这个线程的 run 方法中使用了这段代码来循环和监听连接。
try {
while (gameStarted == false) {
System.out.print(gameStarted);
clientSocket = ss.accept();
ClientThreadOnServer runClient = new ClientThreadOnServer(clientSocket);
clientThreads.add(runClient);
window.updateText();
}
System.out.println("end");
然后我在我的服务器中放置了一个可运行的内部类,它会弹出一个带有计数器和开始按钮的 JFrame,其想法是当用户单击框架中的开始游戏时,布尔型 gameStarted 会翻转,如下所示:
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("start")) {
synchronized (this) {
System.out.println("click");
gameStarted = true;
}
}
}
但它不起作用!当您单击开始时,检测到并按下按钮,因此可能布尔值已更改,但服务器不会退出 while 循环并继续。我想我知道为什么,循环位于 ss.accept();并且没有像我希望的那样测试布尔条件。
我不确定我是否以正确的方式处理这件事,尤其是服务器上的客户端线程列表,我希望随后使用它来控制数据的发送。如果我以完全错误的方式执行此操作,请告诉我应该如何完成,或者如果我不疯狂,我该如何让我的代码工作?
【问题讨论】:
-
while (gameStarted == false) {->while (!gameStarted) {不是答案,只是风格。 -
不,不幸的是没有任何区别,但谢谢
-
对不起,我意识到我的评论并不完全清楚。你在我编辑之前回复了它。
标签: java multithreading