Articles of 客户端服务器

Node.js锁步多人体系结构

背景 我在客户端 – 服务器体系结构中为多人Node.js / Socket.IO游戏使用了锁​​步模型。 用户input(鼠标或按键)被parsing成客户端上的'attack'和'move'等命令,这些命令被发送到服务器并被安排在特定的时间点执行。 这与将状态数据发送给客户端相反,因为带宽问题,我不想使用它们。 每次打勾,服务器都会将该打勾的命令列表(可能为空)发送给每个客户端。 然后服务器和所有客户端将处理命令并以完全相同的方式模拟该打勾。 有了Node.js,实际上这很简单,因为可能在服务器和客户端之间共享代码。 我只是将确定性模拟器放在可以由服务器和客户端运行的/共享文件夹中。 服务器仿真是必需的,以便有客户端不能改变的仿真权威版本。 问题 现在,游戏中有很多实体类,比如Unit , Item , Tree等。实体在模拟器中创建。 但是,对于每个类,它都有一些共享的方法,一些是特定于客户端的方法。 例如, Unit类具有共享的addHp方法。 它也有getSprite (获取实体的图像), isVisible (检查单元是否可以被客户端看到), onDeathInClient (当它只在客户端上死了,像添加公告一样)和isMyUnit (快速函数来检查客户是否拥有该单元)。 到目前为止,我一直在将所有的客户端函数放到共享的Unit类中,并在必要时添加一个this.game.isServer()检查。 例如,当单位死亡,它会调用if (!this.game.isServer()) { this.onDeathInClient(); } if (!this.game.isServer()) { this.onDeathInClient(); } 。 就function而言,这种方法迄今为止工作得相当好。 但是随着代码库的增长,这种编码风格似乎有点奇怪。 首先,客户端代码显然不是共享的,而是放在/ shared文件夹下。 其次,每个实体的客户端特定variables也在服务器实体(如unit.sprite )上实例化,并且当服务器不能实例化variables(它没有像浏览器那样的Image类)时会遇到问题。 所以我的问题是,有没有更好的方法来组织客户端代码,或者这是一个常见的方式为锁步多人游戏做事情? 我可以考虑一个可能的解决方法,但它确实有它自己的问题。 可能的解决方法(有问题) 我可以使用仅在浏览器中添加的Javascript混搭。 因此,在/ shared文件夹中的/shared/unit.js文件中,最后我会得到这段代码: if (typeof […]

人类vs人类的android棋牌游戏devise

首先我是游戏开发的业余爱好者,对于我的英文不好,感到抱歉。 我想做android人类vs人类的国际象棋游戏。 所以我想知道如何devise它? 场景1:用户连接到服务器,find对手并使用套接字发送移动到服务器,所以匹配在服务器端运行。 我认为这不是个好主意,因为移动应该在客户端进行validation – 还是必须在客户端validation移动? 我不认为这是很好的解决scheme,因为游戏是分开的。 场景2:使用打孔技术,所以服务器只需要连接玩家,所以游戏在Android设备上运行。 你建议采用哪种方法? 还是有更好的解决scheme? 哪个服务器最适合使用?

我怎样才能确保所有的客户在延迟方面得到公平对待?

我正在编写一个networking化的实时游戏,我希望服务器在延迟方面不要偏向某些客户端。 不过,我现在的架构非常喜欢一些玩家。 为了显示这个问题,我的游戏服务器的一个令人难以置信的精简版本(没有error handling,游戏逻辑,断开连接处理等)可能是像下面的Python2: import SocketServer, threading global_lock = threading.Lock() clients = [] # Function to broadcast a message to all clients. def broadcast(message): with global_lock: for client in clients: client.wfile.write(message) client.wfile.flush() class Handler(SocketServer.StreamRequestHandler): def handle(self): # Add ourselves to the list of clients. with global_lock: clients.append(self) # Echo characters we receive to everyone forever. […]

当服务器计算与客户预测不一致时,如何更正客户端的移动?

我有一个简单的一些游戏。 建立: 有一个权威的服务器连接到多个客户端。 相同的物理代码在服务器和客户端上运行 当收到input时客户端立即移动(预测服务器计算) input然后发送到服务器和服务器更新游戏状态 服务器将游戏状态发送回客户端 最后一步是我的问题所在: 客户端根据发送的游戏状态服务器来修正其位置,但同时另一个input已经被处理 – 这个input将不得不根据修正后的位置再次模拟 – 这感觉非常笨重,我无法正常工作。 准确地说,我的问题是模拟input和客户端上的位置更正后的世界。 我觉得没有可行的办法,我必须及时回到地图状态(有可移动的平台等)。 有没有其他的networking架构与权威的服务器,这是处理更容易(即使是在安全的代价)? (我不知道它是否相关,但我使用节点js后端和js前端(canvas)的套接字)

服务器端敌人攻击附近玩家的高效解决scheme

我有一个工作的在线游戏服务器,NPC的敌人在那里四处游荡,并在攻击时作出反应。 然而,我很乐意让他们攻击附近的球员,并且可以想到两种方式的performance有问题:从技术上讲,我把游戏世界划分为更小的地方,像玩家,地上的物品,NPC。 1)在每个NpcMove步骤中,遍历同一位置的所有玩家,并检查它们是否接近。 但是,这将需要使用位置的客户端集合上的ReadLock。 我正在考虑制作一个集合的副本,然后迭代呢? 2)有一个静态地图(string[,]),并为每一个玩家的步骤,它会把它的名字到相应的坐标。 NPC AI然后会查看例如相邻的瓷砖,并检查是否有任何玩家进行攻击。 同样,这需要同步访问以写入和读取来自该地图的数据,并且考虑到步行是超频的… 任何想法赞赏

无法从服务器发送消息给所有客户端 – SFML,C ++

最近我开始接触SFML的networking,所以,在网站上查看,以及其他来源,我写了一个简单的聊天程序。 所有的作品都很好,但我不明白的是,我不知道如何发送消息从服务器到服务器中的所有客户端。 代码如下: #include <SFML/Graphics.hpp> #include <SFML/Network.hpp> #include <iostream> #include <string> int main() { std::vector<sf::TcpSocket*> clients; sf::TcpListener listener; listener.setBlocking(false); sf::SocketSelector selector; const std::string address = "127.0.0.1"; const int port = 2100; // Select the side std::cout << "Choose which side you want: Client (c), Server (s)" << std::endl; char choice; std::cin >> choice; switch (choice) […]

如何在多个networking中使用java制作TCP客户端服务器

所以我正在为我的游戏编写服务器代码,而且我有点儿在墙上跑。 我已经看到了一个服务器和客户端的例子,但是如何让它连接到我的networking之外的计算机呢? 我很想做下面的事情 客户端按下一个键向左移动一个单元,服务器收到客户端的input,检查是否进行了修改,是否有客户端返回到它们开始的位置。 我遇到的问题是如何在单独的Internet连接上连接服务器和客户端?

在客户端 – 服务器模型在线游戏中处理数据包模拟

我正在devise一个服务器 – 客户端模型游戏库/引擎。 我该如何处理频繁的更新数据包呢? 在我目前的devise中,任何人都可以从别人处复制数据包,并修改它来为另一个客户端执行任何非关键的动作。 我目前正在压缩所有的数据报,所以只增加了一点安全性。 编辑:我想过的一种方法是每x_time发送一个唯一的“密钥”到validation的客户端,然后客户端必须将其添加到它的所有更新包,直到一个新的密钥发送。 编辑2:我应该提到,我并不担心在数据包中描述的操作是否对客户是可用的,这一切都被我认为是显而易见的服务器检查。 我只关心有人为另一个客户端发送数据包。

我如何实现像素精确的碰撞服务器端?

最近,我用HTML5 Canvas和JavaScript制作了2D离线游戏。 我通过首先检查图像边界框是否重叠来检测碰撞。 如果他们这样做,我检查边界框,看看是否有任何像素存在于同一位置的两个图像。 我从这个教程学习了技巧(YouTube) 。 现在,我正在使用客户端 – 服务器configuration制作游戏的多玩家版本。 我决定让服务器处理所有的物理,包括碰撞。 但是,我不知道如何实现。 由于图像是在客户端绘制的,因此服务器无法访问图像数据来进行像素碰撞testing。 我可以在服务器端创建边界框,但是如何检测像素冲突? 技术细节:我打算在node.js中编写服务器,使用CouchDB或MongoDB作为我的数据库。

客户端 – 服务器体系结构与box2d

我正在运行一个客户端 – 服务器体系结构与权威服务器运行box2d和客户端运行box2d以及。 如果重力被设置为0,那么如果世界对象的力量和冲动被每个快照(例如每秒5次)发出,那么是否有任何一点需要线性插值和创建100ms缓冲来平滑客户端定位? 客户端会顺利地模拟服务器,并删除插值的需要,对吧?