RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1264022
Accepted
Shamus Rezol
Shamus Rezol
Asked:2022-03-31 01:35:44 +0000 UTC2022-03-31 01:35:44 +0000 UTC 2022-03-31 01:35:44 +0000 UTC

服务器如何及时向客户端发送游戏事件?

  • 772

我正在开发某种在线客户端-服务器游戏。我的脑海中闪过以下想法:

在授权请求(登录名和密码)之后,客户端会收到其唯一的令牌,服务器可以通过该令牌根据来自客户端的请求识别它,直到其会话关闭。

为什么是令牌?我要求在每次请求后可以(甚至会)关闭套接字。也就是说,通过打开的套接字识别客户端对我来说不是一个选项。

但!游戏而已。所有非视觉效果都将在服务器上进行,所有视觉效果都将在客户端上进行。也就是说,所有的游戏事件都会发生在服务器上,客户端必须及时显示出来。我假设同时会有十几个客户端,每个客户端都会发送许多自己的请求。所以我需要把游戏的事件转给他们!如果服务器只知道一个关于它的令牌,它自己如何与客户端建立连接?这就是我陷入沉思的地方。

我想到的只是添加来自客户端的垃圾邮件请求,作为响应,服务器应通知他已发生的事件。我认为这不是最合理的解决方案。还有其他方法吗?

сокет
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. S.H.
    2022-03-31T02:21:35Z2022-03-31T02:21:35Z

    亲爱的 Shamus Rezol,恭喜你,你加入了“俱乐部”!

    关于将事件从服务器传输到客户端的问题 - 自然会随着客户端和服务器之间交互场景的逐渐复杂化而出现。你问这个问题真是太好了。

    让我们考虑两种情况。第一个是“浏览器游戏”

    当所有客户端必须不断地“监听”来自服务器的事件时,客户端和服务器之间最简单的通信方式是 WebSocket。

    WebSocket 是一种基于 TCP 连接的通信协议,旨在在浏览器和 Web 服务器之间实时交换消息。

    也就是说,你的解决方案的架构变成了这样:授权后,客户端打开一个到服务器的 WS 连接并等待。

    随着游戏世界在服务器上的发展,服务器向客户端发送“补丁”。客户将它们“强加”在他的卡上。当然,这些步骤中的每一个都需要详细研究,但总的来说,这就是图片。

    玩家的动作从客户端传输到服务器。在同一个网络套接字上。

    第二种情况是当我们没有绑定到浏览器时。

    在这种情况下,事情会稍微复杂一些。

    您希望从服务器接收状态更新而不保持与它的持续连接。从理论上讲,您可以使用 UDP - 只需发送带有状态更新的 UDP 数据包。那么你只有一个问题:客户端可能会“掉线”:更改 IP(客户端进入公寓并从蜂窝网络切换到家庭 WiFi)、位于不允许 UDP 的防火墙后面等。

    然后你必须“围栏花园”:服务器必须“无论如何”发送数据包,即使没有任何改变,超时(例如,5秒),客户端,如果它在期间没有收到数据包超时(例如10秒),必须再次敲击服务器。

    事实证明已经更加困难并且不会节省流量。也许具有永久连接的电路仍然会更简单

    • 0
  2. Best Answer
    Pavel Mayorov
    2022-03-31T02:41:55Z2022-03-31T02:41:55Z

    好吧,理论上服务器可以记住客户端的IP地址,并将其作为客户端连接到服务器。但是在当前的 Internet 中,这种方法无法与 NAT 和其他防火墙和防火墙一起使用。

    因此,只剩下一个正常的选择——服务器只需要等到客户端加入它并确认它的令牌。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5