WebSocket,在线websocket( 二 )


应用使用单独实现websocket协议的服务\客户端组件,可以更加轻松地实现自定义协议:在websocket的二进制或者文本消息体内或者直接使用websocket的自协议定义机制封装自己定义的协议 。推荐大家如果有些需要自建IM服务器,推送服务器的场合尝试先用WebSocket来实现 。负载高(协议头消耗小),协议简洁,几乎所有客户端(减少了大量的工作)都有对应的开源项目可用,同时还是唯一可以在浏览器上用的双向通信协议(flash和silverlight等插件方式除外) 。
如果你要用websocket实现请求应答式的子协议,要点是你要设计唯一的请求标志,响应也将请求标志带回来,然后你就可以从客户端的请求队列中查找响应对应的请求将响应交给上层处理!特别注意:关于webcket持久连接,本质上是下层tcp连接的保持,核心问题同样是如何保活 。需要考虑Nat失效(基站最突出,一般有效期只有3分钟)或者其它网络原因导致大量半连接存在 。
解决方案就是合理的心跳时间,一般我设置为2分50秒的样子 。其它不论是否从事网络编程,都应该花时间学习下TCP/IP协议簇方面的知识,着重理解分层原理,各层的功能和为上层提供了哪些功能 。就像这个问题,如果不对TCP有所了解,回答的内容就没多大意义了 。阅读一个你比较熟悉的语言的的一种协议(比如http)实现项目的源码,帮助应该很大 。
和网络IO密切相关的就是线程,要设计高可用的TCP服务器,必须要熟悉多线程 。网络IO和多线程是我认为最重要的两个核心知识点 。关于协议的设计,你可以多学习其他优秀的基于TCP实现的应用层协议,简单的就有Redis的通信协议,里面有阻塞式的消费者队列,那个就需要一条单独的tcp通道 。协议设计是很有意思的一件事情,就是mysql和mongodb的通信协议我也不会放过,去看看,会给自己设计协议带来不少的参考价值 。
如果时间允许,有标准的协议最好看看RFC文档,现在Chrome的翻译已经很好了,如果英文不太好,问题也不大 。关于TCP/IP相关的书籍《计算机网络:自顶向下方法》和谢希仁的《计算机网络》都是不错的入门书籍 。《TCP/IP详解》是经典,虽然出版已久,内容是没过时的 。网络应用脱离不了操作系统,所以可以再看看操作系统关于网络IO这一块的设计 。

推荐阅读