Java - 创建单独的线程用于通过互联网发送对象

标签 java multithreading sockets event-handling connection

我正在学习中用 Java 编写战舰游戏,用于事件驱动编程。该游戏应该是一款网络游戏,我将在一个应用程序中制作客户端和服务器。

这是代表我的应用程序结构的图像: class diagram http://dl.dropbox.com/u/41993645/mvc.jpeg

言归正传 - 我想编写将作为单独线程运行并负责远程 View - Controller 通信的服务器类。因此,Server 类将负责:

  • 在无限循环中从套接字读取对象,如果有到达, 将它们放入 Controller 的 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

非常感谢您,如果有任何不清楚的地方,请评论。抱歉我的英语。

最佳答案

正常的 java 流是阻塞的。这意味着您通常希望每个套接字连接使用 2 个线程(假设是双向通信)。一个线程专用于每个套接字连接每个流(输入/输出)。

关于Java - 创建单独的线程用于通过互联网发送对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10816005/

相关文章:

java - 多个线程执行相同的方法(非同步)行为

C# 后台线程完成后执行方法

QT QTcpServer::incomingConnection(qintptr handle) 没有触发?

java - 需要处理来自 NON-Activity(.java) 类的点击

java - 电梯不喜欢我的 Web.xml

java - 为什么这在 Java 和字符串长度中有效

multithreading - 调用线程无法访问该对象,因为另一个线程拥有它

scala - Spark Scala UDP 在监听端口上接收

c# - 浏览器尝试连接和 Socket.Accept() 之间的长时间延迟 [~1s]

java - Hibernate:处理多个事务?