游戏大厅从基础开始(6)--绕回来细说聊天室(中)之女仆编年史1

上一篇我们大致的了解了几种聊天室的行为模式

最简单明了的推模式 几乎不需要任何多余的 语言来描述它的实现

这一篇我们看看如何实现拉模式更有效。


本图清晰的表现了 "拉"模式聊天室的行为。

并发多用户向数据池写数据

并发多用户从数据池读 书据

数据最好以时间为顺序储存在集合中

某时间向后的枚举查找将是最大的消耗。

聊天室进化 -女仆编年史神秘的原始社会

仍然参考我们神奇朴素的Asp3聊天室

53     Application.lock
54     Application("show5")=Application("show4") '一条新信息 驾到 第五条信息被淘汰
55     Application("show4")=Application("show3")
56     Application("show3")=Application("show2")
57     Application("show2")=Application("show")
58     Application("show")=NewMessage     '其他所有的信息向前移 动一次给新的信息让个位置。
59     Application.UnLock
60     Response.Write Application ("show5")
61     Response.Write Application("show4") '由于 是postback 模式 必须输出历史n行数据
62     Response.Write Application ("show3")
63     Response.Write Application("show2")
64      Response.Write Application("show")

从线程安全角度来说 本来 response.write应该也在 application .lock 块中  或者分开两个lock块.  但是这里由于 response.write 在非cache模式下可能带来的时间延迟 作者煞费苦心的把他们从安全锁中移动出来.在 实际运行中 很可能出现丢话或者重复发言的状况

application究竟 被人做了些什么? 没有边界   没有抽象包装的这个实现就好像原始共产主义 谁是谁的谁啊这都是!

私有制出现,奴隶社会 LOCK~ 这个女奴是我的~

翻译成c# 我们可以看到一个比较容易理解的逻辑 当然这个代码稍微有 所修改 两个锁很明确 很完美的把数据和线程排起了队伍

Code Snippet

class Channel
{
 Queue<string> MessageQ = new Queue<string>();

 public void Say(string message) //写信息
 {
  lock (MessageQ)
  {
   MessageQ.Enqueue(message);
   while (MessageQ.Count > 5)  // 删多余
   {
    MessageQ.Dequeue();
   }

  }
 }

 public string[] Listen() //u-28781 ?出所有
 {
  lock (MessageQ)
  {
   return MessageQ.ToArray();

  }

 }

}

时间: 2024-10-06 05:04:59

游戏大厅从基础开始(6)--绕回来细说聊天室(中)之女仆编年史1的相关文章

游戏大厅从基础开始(8)--绕回来细说聊天室(下)垃圾列表

前情回顾 我们的最初的需求是建立一个拉模式下用户暂存的顺序信息池 列表-e话通聊天室大厅">还是这张工作模式图 我们可以把这个需求设计为 Clear:清除所有内容 GetEnumerator :实现枚举器,新向旧方向的顺序枚举,这样一旦到达上次读取的时间就可以中断 枚举. RecycleFromButtom:从旧向前进行搜索 把满足条件的扔到GC StackOn :把一个新 信息放在堆栈的顶部 这就好像是一个旧报纸回收传送带,一群人在焚烧之前看看还有没有什么值 得保存的信息 排个照,存个档

游戏大厅从基础开始(5)--绕回来细说聊天室(上)

Wiki定义的聊天室 网络聊天室通常直称聊天室,是一种人们可以在线交谈的的网络论坛,在 同一聊天室的人们通过广播消息进行实时交谈. 聊天室可以建立在即时通讯软件(如MSN Messenger.QQ).P2P软件.万维网(如 Halapo, Meebo ) 等基础上,万维网方式更为普通和种类繁多 ,交谈的手段不局限于文本,更包括语音.视频.通常聊天室是按照房间或频道为单位的,在同一房间 或频道的网人可以实时地广播和阅读公开消息.一般情况下,与其它网络论坛.即时通讯不同的是,聊 天室不保存聊天记录.

游戏大厅从基础开始(7)--绕回来细说聊天室(中间偏下)之女仆编年史2

老少爷们儿反击战 上一篇中 我们的女仆终于可以做一些像阳光下其他人一样的事情了,少爷 们可以和女仆酱一起参加下午茶~ 难得的上流社会啊 这是永远1v1被人私有的女奴 和 喝茶时被 人共有的女仆酱最明显的差异~ 明媚的午后阳光下,庭院里白色长餐桌两旁,英俊的少爷们彼此 交换着最近的趣闻轶事,一面欣赏女仆酱以1/3几率打翻茶水,可爱而笨笨地努力侍奉着,闪闪发光的样 子. 人间极乐喵~~~~~~~~~~ :3 但距离真正的自由~~无Lock还是很远,很远. 因为, 老爷和少爷的调教仍然是一如既往的频繁

游戏大厅从基础开始(4)-通过L2X用配置文件反射组装程序(VB only)

很久没更新了.前一阵工作比较充实(就是比较劳累拉~),加上向老赵学习努力瘦身,精神愈发痛 苦,难免就懒惰下来.通用倒了,项目突然死亡,On bench了一个月,越发的无力. 好消息也是 有的,在m$ msdn论坛努力回答问题,总算当上了个版主.虽然7月申请mvp失败 但是鄙人生性好显摆,好听一点就是爱分享,所以一个咕噜爬起来,又是条好汉. -----------------------闲话到此 为止----------------------- 通过配置来制定程序 说起通过配置来制定程序,不得不

游戏大厅从基础开始(2)——最基础的交流:聊天

从前有个国王叫做混沌 他没有七窍 没办法与外界交流 两个朋友希望他开心 就给他凿了七窍 于是他就死了. 所以我们这一章来给用户添加七窍,让用户和房间具有最 基本的聊天功能. 什么?我前面的故事什么意思? 我也不知道. 其实,网络游戏 交流的最基础,就是聊天室. 如果我们把任何一个网络游戏高度抽象化,把所有的非共性的部分 全部去掉,我们会得到这样一个抽象的流程. 客户端发包 给服务器. 服务器处理包. 客户端收取广播数据. 刚刚好 聊天室恰恰实现了这样一个最简化的流程. 用户 说话. 服务器作简单

游戏大厅从基础开始(3.5)——客户端与服务器的连接

可能要犯大忌讳 本次只有代码 所以补充两句 正在实现策略模式的constructor 所以最 近没有时间整理注释 大家凑合看 随后补说明 Code Namespace Communicate.TCP Class TCPLinkListener Inherits Global.WayneGameSolution.Communicate.LinkListener Public Shared ReadOnly propertyKeys As String() = {"Port", "

游戏大厅从基础开始(1)——最简单的关系,用户与房间

做游戏 就好像写一篇简单的记叙文 作为小学语文大纲要求 记叙文需要完整地叙述: 时间,地点,人物,事件 也就是 WHEN,WHERE,WHO,WHAT HAPPENED 猜猜哪个最重 要? 我选WHO WHO 没有WHO,没有了某个意识的主观活动影响客观环境,故事就是 静止的.那就不叫故事,叫速写. 在一个网络游戏服务模型中,最基础的概念就是 WHO 有了WHO游戏才不是电影电视剧那样的直接灌输. 有了WHO电脑屏幕前的个体才能与别的个体有所 区分 有了个体的区分 网络游戏才可以"互动"

游戏大厅从基础开始(3)——客户端与服务器的连接

本文配套源码 看了上篇随笔的回复 发现大家都很关心如何实现连接. 但是本节可能不会涉及到数据连接的 具体实现. 盲目的实现连接 而不试图从更高的位置来考虑连接的作用,只能徒增耦合. 而网络传输的实现各有特点,耦合过高的话 ,稍不注意业务逻辑就会成为通讯协议的牺牲品. 这种状况 往往让我们产生"只能针对xxx传输协议"的架构 . 其实只要多加思考,我 们便能跳出协议的樊篱,毕竟"遵循某个接口实现一个基于xx通讯协议的类" 属于那种可以几 百块钱外包到"老少边

用ASP实现聊天室中的在线答题游戏

聊天室|在线 主要功能为:在聊天室中,每隔5分钟,向显示对话页面,发送一道题,所有用户都可答题.答对者加相应的分值.具体实现:在聊天室框架中加入一隐含帧,此帧每5分钟刷新一次.隐含帧内的ASP页内容如下:<%@ LANGUAGE=VBScript%><%Response.Expires=0%><%Dim Conn,RsApplication.Lockapplication("CanswerName")=application("answerNam