【问题标题】:How to properly manage sockets for simultaneous battles in a multiplayer strategy game如何在多人策略游戏中正确管理同时战斗的套接字
【发布时间】:2018-09-25 11:53:41
【问题描述】:

我正在开发一款策略游戏,玩家可以在其中互相对战。就目前而言,我专注于制作 1v1 PvP 战斗,但我也想构建一个架构,以便进一步扩展至 3v3 战斗。

我创建的游戏基于套接字客户端/服务器架构。每位进入游戏并按下“查找匹配”按钮的玩家都将与其他玩家进行一场单独的战斗。

但是,我有很多关于如何构建套接字的问题:

  1. 我是否需要为每场同时进行的战斗使用单独的插座(“房间插座”)?

  2. 谁应该创建和绑定房间套接字?如果是客户端,如果客户端的端口关闭,服务器如何连接到这个套接字?如果是服务器,请参见 p. 3

  3. 是否可以将所有这些套接字绑定到一个端口?如果地址和端口相同,客户端如何连接到“他的”套接字?

  4. 何时以及如何打开“房间套接字”以便每个客户端都获得一个对应的端点?服务端怎么写?

  5. 匹配队列需要多少个套接字(“欢迎套接字”)?

  6. 我是使用多线程编程,还是可以不用它?

如果有任何帮助,我将不胜感激

P。 S. 由于我编写服务器的语言不是很流行,所以我不能使用任何现成的解决方案

【问题讨论】:

  • 我们在谈论什么语言(不是很重要,我只是好奇)...
  • @Myst haxe。还没有看到任何用于游戏编程的服务器端解决方案。 Colyseus 不错,但仅限客户端
  • 我的意思是,我仍然无法在 hx 上编写服务器。但是我找到了解决这个问题的简单方法——我可以连接服务器端模拟和node.js colyseus服务器
  • 酷!我从来没有在 Haxe 中编程过,所以对此我无能为力。祝你好运!

标签: websocket server architecture client-server multiplayer


【解决方案1】:

根据您的问题,我怀疑您可以从查看 Beej Guide to Network Programming 中受益。

  1. 我是否需要为每场同时进行的战斗使用单独的插座(“房间插座”)?

我不确定您所说的“房间”插座是什么意思。如果您的意思是为每个游戏分配不同的侦听套接字,那将是不切实际的。

通常的做法是让服务器在单个套接字(地址/端口)上侦听,每个客户端都将连接到服务器的套接字。

这意味着服务器将有一个套接字每个活动客户端 + 一个监听套接字,每个客户端实现将有一个套接字(连接套接字)。

对于 1:1 游戏,服务器可以将套接字“匹配”到对联,将“对联”变成一个房间。

对于 1:many 游戏,您可能会考虑通过实现“频道”和“订阅”来使用发布/订阅模式...但是,因为(我假设)玩家一次只能进入一个游戏,您可以考虑为每场比赛制作一个玩家数组或链表。

  1. 是否可以将所有这些套接字绑定到一个端口?如果地址和端口相同,客户端如何连接到“他的”套接字?

是的,这是可能的,这就是服务器的实际工作方式。

侦听套接字的行为与连接套接字略有不同,因为侦听套接字可以“接受”连接并为每个连接创建一个新套接字。

  1. 何时以及如何打开“房间套接字”,以便每个客户端都能获得相应的端点?服务端怎么写?

这取决于语言。大多数语言在the Beej Guide to Network Programming 中的监听功能上都有一些变化。

通常,服务器会调用listen,然后使用accept 创建新的客户端套接字。客户端将调用 connect 并拥有一个套接字。

  1. 匹配队列需要多少个套接字(“欢迎套接字”)?

对于 1:1 游戏,您需要一个“排队”的套接字,因为它等待下一个可用连接。

当然,这可能更复杂。如果客户有游戏需求(即只有 10 级及以上的玩家),您可能需要有序列表或其他数据存储来管理队列。

  1. 我是使用多线程编程,还是可以不用它?

如果您使用事件(非阻塞)设计,您可能可以在单台机器上使用单线程运行数千个游戏。

这实际上取决于服务器上执行的工作量与客户端计算机上执行的工作量。

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 1970-01-01
    • 2012-05-03
    • 2023-03-25
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2012-01-09
    相关资源
    最近更新 更多