基于websocket的聊天demo

2017-03-19

初步探究 websocket。

  现在有很多网站都有推送服务,比如在线聊天,拍卖,在线游戏,体育结果发布,终端监视,以及高级网络监控等。这种持久通讯在不刷新页面的情况下进行,消耗一定的内在资源常驻后台,并且对于用户不可见。体验非常友好。

  为了实现这种技术:所用的技术都是轮询。

  以前的技术去做轮询的效果是Comet: 能使服务器实时地将更新的信息传送到客户端,实现方式,长轮询,短轮询和iframe流。

  • 短轮询:

  这个很简单, 一般在客户端 js 采用 setInterval 或 setTimeout 实现,思路是客户端定时请求服务端对应的接口,使用 ajax。如果有新内容,则插入或者更新旧的内容。

  但是这样浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,甚至没有新的数据返回,返回空数据。显然这样会浪费很多的带宽等资源。并且请求数超过一定阀值,会对服务器造成一定的负担。

  • 长轮询

  长轮询和短轮询原理是一样的 , 但是如果服务器没有可以立即返回给客户端的数据,则不会立刻返回一个空结果,而是保持这个请求等待数据到来(或者超时),之后将数据作为结果返回给客户端。

两种轮询的区别是 短轮询在 C 端 进行定时请求,长轮询是在 S 端进行 定时请求。但是:长轮询可以减少请求次数,解决短轮询带来的带宽浪费,但是同样会消耗服务器资源

  • iframe流

  iframe 流方式是在页面中插入一个隐藏的 iframe,利用其 src 属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是 HTML,内有负责插入信息的 javascript),来实时更新页面。

iframe 流方式的优点是浏览器兼容好,Google 公司在一些产品中使用了 iframe 流,如Google Talk。

  现在:HTML5 定义了 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。 由于 WebSocket 本身是基于 TCP 协议的,所以在服务器端我们可以采用构建 TCP Socket 服务器的方式来构建 WebSocket 服务器。

  一个简单的聊天程序,直接运行即可: git地址

参考: