em-websocket
By admin
第一次做websocket的东西。
eventmachine和原来习惯的顺序执行思路的编程相差很多。先是在
本以为客户端会每两秒收到一次信息,但是结果是等3次都执行完,server一次性发送全部信息给client
后来看eventmachine的api发现TickLoop这个循环可以非阻塞的立即发送信息给client,将普通循环替换成
但是由于是非阻塞,tick_loop后面的代码会立即执行,而不管tick_loop,导致在tick_loop中的变量和后面变量不一致。
开始还以为在tick_loop中生成了新的线程,复制了局部变量,但是debug变量的object_id后发现是没变的,后来显示前后的时间才发现了执行的顺序不对劲。
再后来,发现在tick_loop中,ws.send 也是每次循环之后一起发送,而不是按照先后顺序调用的发送,比如
在server的两次puts 相差1秒,但是在client的接收确实同时接收,没有时间差。
最后试来试去,发现在EM.defer里用常规的循环,可以实现我想要的效果。在defer里用tick_loop不能。
这样client可以按照时间顺序接收到消息。
后来想想,ws这中模式,应大有作为,替换掉原来的http开发模式,使web程序变得更有交互性。大概主要的交互方式有两种,一种是直接推送js,让浏览器执行更新数据。
一种是推送json,里面有需要调用的函数,与该函数的参数然后eval执行。应该是后种更好一些,交互的数据量更小但需要前台有丰富的接口支持。大概这类的前台框架国外已经有了吧我想。
不过当前的开发主流框架还没有跟进到这个地步,web的开发流程与开发者也需要很大的逻辑转变。