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:串行与并发服务程序
- Erlang聊天程序后端(二)
- Erlang聊天程序后端(一)
- Erlang聊天程序后端(三)
- 聊天程序(二)
- 微信小程序支付 后端PHP(二)
- erlang客户端程序学习(二)
- 小程序即时通讯聊天控件(二)
- Erlang 配置(二)
- Erlang入门(二)
- 采用行写方式的聊天程序(之二)
- ACE学习笔记二(开发聊天程序)
- 基于socket的简单聊天程序(二)
- Delphi简单TCP聊天程序(二):双向传输
- 简易聊天程序教程(二)服务器的基本功能
- Erlang 聊天室程序(二) 客户端的退出
- 聊天程序(C++)
- 聊天程序(一)
- LLVM(二):后端结构
- 线程和进程的区别?
- 《分布式JAVA应用 基础与实践》 第七章 构建可伸缩的系统
- web系统怎么识别登陆的帐户是同一台电脑登陆 用户绑定电脑
- 漫话网络带宽估计
- String和StringBuffer的区别?
- Erlang聊天程序后端(二)
- socket 编程
- 面向对象的特征有哪些?
- POJ 1264 UVA 109 简单的计算几何
- R语言与机器学习学习笔记(分类算法)(1)K-近邻算法
- JAVA WEB
- java中的匿名内部类
- python学习(基础知识)
- ARM汇编指令的一些总结[转]