-1

最初我想在播放器的地方使用套接字

向服务器发送请求,服务器处理请求并发送回复。或者玩家可能需要每隔一段时间发送一次游戏状态更改的查询。

这是最坏的主意吗?

第二个问题,与服务器端代码有关。目前,每个传入的连接都会产生一个新线程来运行它的任务,主要是从硬盘驱动器上读取一些文件并将字符串发送回请求它作为响应的 android 设备。

但我想知道可扩展性。例如,假设有一百万玩家每分钟打开一个套接字线程,持续 10 秒。在任何给定时间,可能有大约 20,000 个并发线程在运行并且需要使用硬盘驱动器文件 IO 进程......

如果这明显不切实际,你有什么替代方案?谢谢和抱歉,我以前从未尝试过任何网络或类似的事情。

4

2 回答 2

1

即使只做一个简单的游戏,我也会考虑使用 Message Broker。它通过包开销增加了网络流量,但它具有令人难以置信的灵活性和可扩展性。

查看消息中的请求-回复模式:

http://www.eaipatterns.com/RequestReply.htmlhttp://www.eaipatterns.com/RequestReply.html

查看此特定代理的 RPC 和主题教程:

http://www.rabbitmq.com/java-client.html

您可以为特定客户端订阅交换中的任何主题,并且可以在运行时更改它们。我为寻找游戏的客户设想了一个主题,然后将它们移动到一个独特的顶部或 que。

我意识到它没有目的,但认为它是比套接字更现代的 TCP/IP 抽象层。您想做的大部分事情都已经完成,您将有更多时间去做有趣的事情!:-)

于 2012-11-16T02:02:20.090 回答
0

我建议使用线程池: http ://www.javamex.com/tutorials/threads/ThreadPoolExecutor.shtml

有了这个,您不必继续创建和销毁线程,但许多线程总是在那里,等待任务。这将避免创建和销毁线程的开销。

关于 IO,您希望避免从多个线程同时读取同一个磁盘,因为这会导致硬盘驱动器浪费时间从一个位置寻找到另一个位置。我将通过实现一个串行管理文件读取的类来解决这个问题。您的每个线程都可以向此类发出请求以读取特定文件并提供在读取文件后调用的回调方法。然后,在您的回调中,您可以处理文件并提出要发送回手机的响应。这也将确保您不会在 2 个线程中意外写入同一个文件。

此答案显示了如何使用回调实现任务:https ://stackoverflow.com/a/443741/1675231

希望能帮助到你。

于 2012-11-16T01:02:45.867 回答