Erlang聊天程序后端(二)

来源:互联网 发布:apache日志文件在哪 编辑:程序博客网 时间:2024/05/19 22:50

Day4

       11月6号一早醒来,急于探求如何实现分组的概念。

       第一种比较直接的方法就是端口值对应着相应的房间,若是我们有两个房间,那么我们就启动两个服务端的socket程序,分别监听不同的端口;client socket发起连接的时候选择一个端口,那么它发送的信息只能由与该端口相匹配的server socket接收,同时recv socket也只能接收到相应端口广播出来的信息,就如同有了两个独立的聊天室,各不打扰,如图:


Figure4:通过端口号分组

       除了使用不同的端口来实现不同的房间号之外,还可以对发送的数据增加一个Group字段来匹配房间,recv socket接收到包,若此包的房间号与自己的房间号相对应,则输出,否则,不输出到聊天室,这样就不用使用多个端口了。对代码稍作修改后:


Figure5: 通过Group字段分组

       此时,两个不同的send socket选择了不同的房间号(group_1,group_2),它们发送的信息各自呈现在不同的聊天室里面。值得一提,这里的recv socket仍然接收了它不需要的包,只是不输出到聊天室而已。更好的方法是不接收不需要的包,我想应该是使用过滤函数,不过目前还没有知道有什么以及怎么使用那个过滤函数,所以,略过……

       测试题目中提到一个公共房间world,所有的人都可以看到,我们可以内定一个world分组,在recv socket里面模式匹配的时候,除了匹配到自己的房间号,匹配到world这个大房间也把信息打印出来,就可以了!

       上课回来后,继续优化,很快就实现了显示时间的功能:

  

Figure6:房间显示时间

       同时,给发送端也建立一个时间戳,惊讶的是,发送端和接收端的时间竟然是一样的,按道理应该会有一定的延迟的啊,或许是在同一个主机里面,这种延迟察觉不出来吧:

Figure7:发送端显示时间

       之后,在sent client每次发送信息之后,调用timer:sleep()方法阻塞3秒,继续执行循环,这样,输入端就不能够在3秒之内发送第二条信息了:

      

Figure8:3秒内不能发送信息

程序的基本逻辑已经有了,不过,在Learn You Some Erlang For Great Good一书里面提到过,这个服务socket是串行的,每次匹配到一个socket,就起一个进程来处理相关的操作,要是同时来了100万个socket,那么其他socket就要等待很长的时间了。当然,在之前的测试都是起了3,5个socket,完全没有感受到要等待的苦逼……好,接下来看看里面一个改进的例子。

例子里面用到了很多新的东西,supervisor,behaviour,handle等等,一下子被各种概念晕住了,总体来说是理解了概念,但是合起来实现一个整体还是很困难,这部分应该属于OTP编程吧,也就是说这个并发服务器是借助与OTP里面的module来实现的吧。于是,继续查找资料去……

OTP gen_server还真不好弄,主要是实现behaviour要实现一些回调函数,而回调函数好像又嵌入到普通函数里面,绕老绕去,有点看不清线路了。不过实现并发的模型好像主要在supervisor这个地方,引用图:


Figure 9:串行与并发服务程序


原创粉丝点击