【问题标题】:How are client server applications implemented? (server side) (asking about concept)客户端服务器应用程序是如何实现的? (服务器端)(询问概念)
【发布时间】:2015-03-15 03:37:25
【问题描述】:

我正在制作一个简单的在线井字游戏(多人)。 客户端是java(android) 服务器端是python(共享主机服务器上的linux)

我的问题是关于服务器端的: 我首先想到有一个套接字(因为我只允许使用服务器上的一个端口),然后它等待 2 个用户连接并将它们配对在一起,启动一个新线程来处理它们,然后等待另一个 2用户等等。 但是在这里阅读了很多关于多线程的信息后,我发现服务器最多可以处理 20 个线程。 所以我尝试使用进程而不是线程,但我得到了相同的结果。 而且我发现socket最多可以处理50个连接。

有什么想法吗? 谢谢

【问题讨论】:

  • 你在哪里发现服务器只能处理 20 个线程.. 我认为这是错误的假设..
  • 我觉得最大的问题在于套接字的工作方式,我必须在整个游戏过程中保持客户端连接。如果可以选择只发送一串数据而不建立可以解决问题的“连接”。
  • @Karthikeyan 我刚刚在我的服务器上尝试过,我使用主机 gator(最便宜的包)我想即使我购买更昂贵的主机,我仍然会受到数量的限制我可以拥有的线程数。例如,如果我有成千上万的玩家怎么办?
  • 我建议您为此使用标准的 linux 节点,而不是共享主机 ..
  • 如果您想扩展到成千上万的用户,只需不要编写自己的服务器 - 选择一个技术堆栈并在该堆栈之上实现您的应用程序。每个堆栈具体如何工作的细节差异很大(即随机选择两个,将 LAMP 与 node.js 进行比较,两种完全不同的方法)

标签: java android python multithreading sockets


【解决方案1】:

要无限扩展,如果您控制客户端代码(这样您就知道人们不会作弊 - 在井字游戏中他们不太可能这样做:-),您可以让客户端打开并提供用于连接的侦听套接字——当一个奇怪的客户端连接时,只需用“请稍候”消息进行响应;当偶数客户端连接以匹配它时,使用彼此的侦听套接字信息响应两个客户端,然后让开。

这不适用于无法打开和侦听新套接字的客户端(例如,被隔离在某些 NAT 安排后面的客户端)。在这种情况下,您可以将客户端(用于彼此之间的后续交互)切换到与您的服务器之间的 UDP —— UDP,不是面向连接的,可以为任意数量的客户端(客户端对,在您的案例!)在单个套接字上(但是你有责任在客户端和服务器端合作!检查/确认数据包并确保它们的良好排序,TCP,是面向连接的,代表你处理:-) .

我不确定您的所有约束到底是从哪里来的,或者其他哪些约束(例如客户端无法打开、通信和收听新套接字...)可能适用。

但无论如何,一旦您完全了解并告诉我们 所有适用的限制条件,总能找到一些解决方案(也许是新奇的 conniptions,例如 pub-sub,例如 https://cloud.google.com/pubsub/docs——只要出现新的约束,或者更快!聪明的人总是在想办法解决...!-)

【讨论】:

  • 谢谢你真的很有帮助。我不知道 TCP 和 UDP 之间的区别。现在我知道用谷歌搜索什么了。不幸的是,我不认为客户端可以监听套接字,因为我不能告诉每个客户端为游戏打开其路由器上的端口。
  • 真的很抱歉,我现在已经投票了。谢谢你,我真的很感激。
猜你喜欢
  • 1970-01-01
  • 2018-01-05
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多