【发布时间】:2012-05-30 12:11:29
【问题描述】:
我正在学习用 Java 编写用于事件驱动编程的 Battleships 游戏。游戏应该是网络游戏,我打算在一个应用程序中制作客户端和服务器。
这是代表我的应用程序结构的图像: class diagram http://dl.dropbox.com/u/41993645/mvc.jpeg
直截了当-我想编写将作为单独线程运行并负责远程视图-控制器通信的服务器类。因此,Server 类将负责:
- 无限循环从套接字读取对象,如果有的话, 将它们放入控制器的 BlockingQueue 中。
- 提供诸如“sendActionEventToView()”之类的方法,这将允许 Controller 以另一种方式传递对象 - 从 Controller 到远程 View。
不幸的是,当运行服务器线程时,整个应用程序停止响应。如果有人能告诉我我做错了什么,我将不胜感激。我认为这是服务器代码的问题部分:
/** Main Server method - responsible for reading objects
* and putting them in the queue if any arrived */
public void run() {
GameEvent event;
while(true) {
try {
event = (GameEvent)objectStream.readObject();
if(event != null) eventQueue.put(event);
} catch(ClassNotFoundException e) {
e.printStackTrace();
} catch(IOException e1) {
e1.printStackTrace();
} catch(InterruptedException e2) {
e2.printStackTrace();
}
}
}
我认为线程挂在“readingObject()”上 - 如果流中没有任何对象,我如何强制它将处理器时间分配给另一个线程?
服务器的其余部分:https://github.com/mc-suchecki/Battleships/blob/master/controller/Server.java 应用程序的其余部分:https://github.com/mc-suchecki/Battleships
非常感谢您,如果有任何不清楚的地方,请发表评论。对不起我的英语。
【问题讨论】:
-
在大多数人回答之前,您将不得不发布一些简洁的代码示例。我建议您添加更多
println调试或使用调试器来找出您的问题。 -
谢谢,我已经发布了有问题的代码。我试过调试,但我的知识让我只是找到问题,但不幸的是没有解决它。
-
您是在每个客户端启动一个线程,还是一次从一个客户端连接读取?
-
好吧,我应该写的。游戏应该是 p2p - 开始时玩家选择是要托管游戏还是连接到另一台服务器。每台服务器只允许一个客户端。见 createServer() 和 connectToServer() 代码:github.com/mc-suchecki/Battleships/blob/master/view/View.java
标签: java multithreading sockets event-handling connection