2

我在客户端用 j2me 编写游戏,连接到用 java 编写的服务器。该游戏将具有聊天功能,但作为次要功能。

对于连接到服务器的每个 midlet,都会生成一个服务器游戏线程。这些线程在它们之间进行对话,以便它们可以同步并轮流写入服务器中的一系列配置文件。现在,如果在其中一个 midlet 中写入聊天消息,它会被传递到管理套接字通信并发送到服务器的客户端线程。在服务器中,通知同一游戏的所有其他玩家,并将聊天消息转发给所有其他玩家。因此,每个服务器线程(但最初发送消息的用户)都将消息发送到其对应的客户端线程。

我的问题来了。我如何向每个 midlet 发出信号,以便它知道有新的传入消息?

我想过创建一个线程来轮询客户端通信线程以查看是否有任何新消息。但是,我怎么能从 midlet 中知道而不中途打断呢?理想情况下,我想直接读取客户端通信线程中的字符串,但该字符串可能正在写入,因此我需要一个线程来访问它并与之同步。

你们中的任何人都可以伸出援助之手吗?我真的不知道如何进行,看起来这应该很简单......

提前致谢

4

2 回答 2

1

不幸的是,由于手机通常不会将大部分时间都花在连接互联网上,唯一可用的真正推送机制是通过PushRegistryAPI 发送的 SMS/MMS。真正推送的真正问题是服务器需要一种方法来识别客户端,而您不能依赖移动网络运营商为您的手机提供的临时 IP 地址。

如果您计划使用 HTTP 连接通道,则需要轮询服务器以获取聊天消息更新。但是,有一些方法可以使这种情况变得不那么糟糕。

如果您的游戏应该定期向/从服务器发送/接收数据,您可以将聊天数据捆绑到您自己的协议中的 http 请求和回复的正文中。

您可以通过使用 SMS 推送触发数据的 HTTP 检索从技术上混合这两种方法,但这可能会变得昂贵。

关于在您的 MIDlet java 代码中正确使用该synchronized关键字,我建议您提出一个更精确的问题,其中包含代码示例,因为它是一个不同的问题域。

于 2009-09-29T14:41:04.457 回答
0

你几乎从不想投票。在几乎所有情况下,轮询都是一种可怕的资源浪费。使用您建议的设计,每次轮询线程触发时都会进行上下文切换,这也将需要几个周期来检查它是否应该处理请求。将轮询添加到网络代码中,您正在谈论一些严重的延迟。

使用观察者模式可以轻松解决您面临的问题。(是来自 patterndepot.org 的该模式的 pdf 解释。是 JavaWorld.com 上的解释)此外,在多线程环境中工作,轮询具有上下文切换和同步的缺点,然后发现您不需要花费这些资源来检查您的消息总线。查看使用java.util.concurrent包中的并发集合来存储您的消息。

最后,您的一般架构听起来需要在服务器端进行一些修改。如果您计划拥有高用户负载,因为为每个用户引入新的中间层处理线程最终会导致服务器性能下降,因为您有更多的上下文切换,并且任务变得更加强大。

于 2009-09-25T18:12:51.147 回答