什么是保持用户连接的最佳设计/方式?

9

我正在进行一个自学的POC项目,其中我想保持我的用户以LIVE模式连接。例如,在一个可以同时容纳4个用户玩的游戏中,我需要让这些用户与我的游戏保持连接。

我不擅长Socket编程类型,而且喜欢以服务方式完成。我想知道“最佳方法是什么”。根据我的初步头脑风暴,我已经决定使用SilverLight(在浏览器内或浏览器外)作为前端[我对此没有问题]。

我更关心后端。我可以制作处理程序或制作WCF服务,或者使用全双工服务并使用轮询机制。作为一种随意的想法,我提出了一个计时器类型的逻辑,它将在客户端每10秒钟触发一次,并获取状态,例如:

  • 现在轮到他们掷骰子了吗?

  • 还剩下多少用户(如果有人离开)

  • 连接的用户在游戏中的状态,如得分/积分等,并根据此更新游戏视图

请在此处提供您的最佳答案,这将帮助我学习。

谢谢您的帮助!

编辑:

我需要更多反馈,因此开始悬赏。

FH

3个回答

11

Fasih,

由于HTTP是无状态的,所以您无法从代码中进行双向通信。但是,如果您正在使用AJAX,则有一个解决方法。正如您所说,计时器只能进行单向通信,另一个解决方案是称为COMET或反向AJAX。

这模拟了双向通信,而不依赖于定时器。要实现此目的,您必须向服务器发出长时间运行的AJAX调用,并且仅在更新更改时才返回调用。假设简单的Web聊天场景。 2个用户向服务器发出长时间运行的AJAX调用,并且两者都轮询公共介质(例如DB)。如果用户1发送一些文本,则它将被更新,并且用户2的等待AJAX调用将获取文本并返回。然后,两个用户都会进行长时间运行的调用以相互侦听。

由于您已经决定继续使用Silverlight,因此可以使用WCF双工通道来模拟双向通信。就像我之前解释的那样,请不要使用计时器逻辑。如果您每10秒轮询一次服务器(在游戏中,任何事情都可能发生),则它不是即时的,并且如果您每秒轮询一次,则会增加服务器负载。

因此,避免计时器逻辑并使用长时间运行的AJAX调用。

如果您正在寻找除WCF双工通道之外的选项,则HTML5 Web套接字和COMET是其他解决方案。

请查看此帖子以获取支持Web套接字的浏览器。


很好的回答。我喜欢那个。从中我可以制作自己的Loon运行Ajax调用机制。让我查看一下。我会更新的。 - Singleton
刚刚看到了你的回答,比我的好多了。没错,如果使用定时器,服务器负载会更高。 - Mahesh
伙计,我刚才才看到你的回答。如果我早就看到了,我就不会浪费时间评论我说的话,而且我还说你的回答比我的好。这仅仅是出于礼貌。 - Mahesh
没问题,我也经常遇到这种情况 :D - Mahesh
你知道服务器上长时间运行的ajax调用是如何工作的吗?或者有没有关于这方面的好文章? - Mahesh
@Mahesh,这与普通的 AJAX 调用相同。唯一的区别是普通的 AJAX 调用通过完成其专用工作立即返回。长时间运行的调用位于服务器上,并订阅某些其他事件以进行通知。只有在从发布者接收到数据时才会返回给调用者。在 Web 聊天场景中,所有长时间运行的调用都会轮询数据库(订阅)或其他数据存储库以查找其他用户的数据。如果有任何更新,它将返回给调用者。将其视为无限 while 循环,等待条件满足以退出循环。 - RameshVel

1
基本上这是关于能否从服务器向客户端推送数据的问题。 所以我在想使用订阅-发布架构,您可以为每个连接的用户在服务器上创建一个队列(例如在数据库表中),并有一个ajax调用Web服务从该表中拉取数据。
每条消息都应封装为客户端的命令。因此,您可以针对客户端能够执行的每个操作使用不同的消息。{command:display,text:“用户blah blah已登录”}另一个命令可能类似{command:rolldice,text:“掷骰子”}
告诉我你的想法...

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接