我正在构建一个战略游戏,玩家可以在其中相互搏斗。就目前而言,我专注于进行1v1 PvP战斗,但我也想构建一个架构,该架构将允许最多扩展到3v3战斗。
我创建的游戏基于套接字客户端/服务器体系结构。每个将进入游戏并按下“查找匹配”按钮的玩家都将与另一位玩家进行单独的战斗。
但是,我对如何构造套接字有很多疑问:
每次同时战斗都需要单独的插座(“房间插座”)吗?
谁应该创建并绑定房间套接字?如果是客户端,如果客户端的端口关闭,服务器如何连接到该套接字?如果是服务器,请参阅第40页。 3
是否可以将所有这些套接字绑定到一个端口?如果地址和端口相同,客户端如何连接到“他的”套接字?
何时以及如何打开“房间套接字”,以便每个客户端都将获得对应的端点?如何在服务器端编写它?
配对比赛队列需要几个套接字(“欢迎套接字”)?
我要使用多线程编程,还是可以不使用它?
我将不胜感激
P。 S.由于我编写服务器所用的语言不太普遍,因此我无法使用任何现成的解决方案
答案 0 :(得分:1)
从您的问题中,我怀疑您可以通过回顾Beej Guide to Network Programming而受益。
- 每次战斗我都需要一个单独的插座(“房间插座”)吗?
我不确定您所说的“房间”插座是什么意思。如果您要为每个游戏分配一个不同的监听套接字,那将是不切实际的。
通常的方法是让服务器在单个套接字(地址/端口)上侦听,并且每个客户端都将连接到服务器的套接字。
这意味着服务器将为每个活动的客户端有一个套接字+一个侦听套接字,并且每个客户端实现都将有一个套接字(连接套接字)。
对于1:1游戏,服务器可以将套接字“匹配”到对联,从而将该“对联”放入房间。
对于1:1的游戏,您可以考虑通过实现“频道”和“订阅”来使用发布/订阅模式...但是,由于(我假设)玩家一次只能进入一个游戏,您可以考虑将每个游戏的玩家排列成阵列或链接的列表。
- 是否可以将所有这些套接字绑定到一个端口?如果地址和端口相同,客户端如何连接到“他的”套接字?
是的,这是可能的,这就是服务器的实际工作方式。
在某种意义上,侦听套接字可以“接受”连接并为每个连接创建一个新的套接字。
- 何时以及如何打开“房间插座”,以便每个客户端都获得一个相应的端点?如何在服务器端编写它?
这取决于语言。大多数语言在the Beej Guide to Network Programming上侦听的功能都有一些变化。
通常,服务器将调用listen
,然后使用accept
创建新的客户端套接字。客户端将呼叫connect
并有一个套接字。
- 配对队列需要几个套接字(“欢迎套接字”)?
对于1:1游戏,在等待下一个可用连接时,需要一个“已排队”的套接字。
当然,这可能更复杂。如果客户有游戏要求(例如,只有10级及以上的玩家),则可能需要有序列表或其他数据存储区来管理队列。
- 我要使用多线程编程,还是可以不用它?
如果使用事件(非阻塞)设计,则可以在具有单个线程的单台计算机上运行数千个游戏。
这实际上取决于服务器上执行的工作量与客户端计算机上执行的工作量。