python - python 中的多人服务器套接字

标签 python sockets tcp udp multiplayer

我正在尝试为 iPhone(cocos2d) 创建一个多人游戏,快完成了,但还剩下多人游戏部分。我已经在网上搜索了两天,但找不到任何可以回答我问题的东西。

我已经创建了一个搜索室(端口 2000 上的 TCP 套接字)来匹配搜索快速比赛的玩家。两名玩家匹配后,该服务器将他们与搜索室断开连接,为传入的搜索者(客户/玩家)留出空间

现在我想知道如何创建游戏室(两个玩家互动和玩游戏的地方)?

我在想我可以在一个新的端口上创建一个新的 tcp/udp 套接字,让匹配的(在搜索室中匹配的)玩家连接到那个套接字,然后有一个完美的隔离房间让两个人相互交互.

或者我是否需要一台新服务器(机器/硬件)而不是在该服务器上创建一个新套接字并让对等玩家连接到它。

或者也许还有另一种方法。

OBS。我暂时不会让游戏在服务器上运行来对付作弊者。因为这对我的设置中的服务器 CPU 来说负载太大。

最佳答案

I was thinking I could create a new tcp/udp socket on a new port and let the matched(matched in the search room) players connect to that socket and then have a perfect isolated room for the two to interact with each another.

是的,你可以做到。而且根本不应该有任何困难。您只需在第一个可用端口上绑定(bind)一个套接字,将该端口传递给两个玩家,然后等待他们连接。如果您担心黑客突然袭击,例如,对开放的新端口进行端口扫描,有一些方法可以解决这个问题,但鉴于您没有尝试任何廉价的保护,我怀疑这是一个问题。

Or do I need a new server (machine/hardware) and than create a new socket on that one and let the peered players connect to it.

为什么需要它?它能为你做什么?当然,它可以减轻第一台服务器的一些负载,但如果这是问题所在,您可以通过多种方式进行负载平衡;像这样不对称地进行操作往往会导致一台服务器为 100%,而另一台服务器为 5%……

Or maybe there is another way of doing this.

一个明显的方法是什么都不做。让他们继续与他们已经在交谈的同一个端口交谈,只需附加一个不同的处理程序(或客户端状态机中的不同状态,或其他任何东西;你没有给我们任何线索你是如何实现你的服务器的).我不知道你认为你从“完美隔离”中得到了什么。但即使您希望它成为一个不同的进程,您也可以将两个客户端套接字迁移到另一个进程;没有理由让它们连接到新端口。

另一种方法是让服务器完全不受影响——STUN 或将它们打洞在一起,让它们采用 P2P 游戏协议(protocol)。

介于这两个极端之间的任何事情似乎都不值得去做,除非您有一些您没有解释的限制。

OBS. I am not going to have the game running on the server to deal with cheaters for now. Because this will be to much load for the server cpu on my setup.

我猜如果在服务器上放置最小的游戏逻辑以防止作弊都太昂贵,那么为每对客户端分拆一个单独的进程也可能太昂贵。不这样做的另一个原因。

关于python - python 中的多人服务器套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25261552/

相关文章:

python - sqlalchemy.exc.OperationalError : (pymysql. err.OperationalError)(2013, 'Lost connection to MySQL server during query')

python - python中的缓冲区是什么意思

c++ - 如何在 VC++ 中禁用 Windows TCP/IP 堆栈 [以编程方式]

c - 多客户端服务器 : quitfunction

qt - 为什么 QWebSocketServer 在客户端连接尝试时发送 TCP [FIN] 消息

python - Altair 折线图中的工具提示

python - 是否可以从 python unittest.TestCase 运行单个测试方法并引用该方法?

.net - 如何将 boost::asio 套接字转换为 C++/CLI .Net 套接字?

java - 拦截应用程序发出的套接字调用并将其映射到自定义套接字

sockets - 使用 sslStream 类包装在 ssl 流中