node的ws模块可以很方便地创建一个单纯的标准websocket服务,但是对于创建wss服务并没有提供一个独立的方法,还是使用创建ws服务的方法,在传入参数对象里加了个自定义的https服务。
也不知道是我找错了文档还是官方文档就那么简洁,不过readme文件写的文档的确是这个→doc/ws.md,然后我研究了好几天还翻了遍它的源码和examples才终于理解了这个文档。
node上有多种websocket模块可以选择,本文推荐模块`ws` ,因为它不需要在客户端挂额外的js文件。
不像`socket.io` 模块,`ws` 是一个单纯的websocket模块,不提供向前兼容(也就是fallback),使用最新浏览器的原生Websocket API即可通信。
前两天做了个node版的websocket在线服务端,现在顺手给佳佳酱也加上了。
使用方法还是很简单的啦,只有打开服务端,然后在要显示在线数量的页面加上以下脚本(这是我用的代码)
(function() { try { var siteol = $("#online_number #site_ol"),//获取填写全站在线数的元素 pageol = $("#online_number #page_ol");//获取填写本页在线数的元素 } catch(e) {} var sitesocket = { newconnection: newconnection, socket: null, pinginterval: null }, pagesocket = { newconnection: newconnection, socket: null, pinginterval: null }; function ssiteol(num) { if (siteol.length) { siteol.html(num) } else { $(window).load(function() { siteol = $("#online_number #site_ol");//注意修改这里,我后来为了在页面加载完之前就先发起连接,又要确保可以填入正确位置做的修改 siteol.html(num) }) } } function spageol(num) { if (pageol.length) { pageol.html(num) } else { $(window).load(function() { pageol = $("#online_number #page_ol");//还有这里 pageol.html(num) }) } } function _(type, data) { return JSON.stringify({ type: type, data: data }) } function newconnection(url, callback) { clearInterval(this.pinginterval); if (this.socket && this.socket.readyState !== 3) { return } else { delete this.socket } var inte; this.socket = new WebSocket("ws://urlonline.coding.io:80");//修改成你自己的在线服务器地址 var so = this.socket; this.socket.ping = function() { so.send("1") }; this.socket.onopen = function(data) { so.send(_("url", url)); inte = this.pinginterval = setInterval(so.ping, 30000) }; this.socket.onmessage = function(data) { if (typeof data == "string" && data === "1") return; var msg = JSON.parse(data.data); switch (msg.type) { case "ol": { callback(msg.data); break } } }; this.socket.onerror = function(data) { clearInterval(inte); delete so; setTimeout(newconnection, 3000, url); callback(0) }; this.socket.onclose = function(data) { clearInterval(inte); delete so; setTimeout(newconnection, 3000, url); callback(0) } } //初始化连接 sitesocket.newconnection("site://blog.luojia.me", ssiteol);//使用site://前缀标识统一的被请求地址(此网站) pagesocket.newconnection(window.location.href, spageol)//使用本页的href作为被请求地址 })();
可以断线自动重连,喵喵喵!
不过人少的站加上了它显得更寒酸了 (๑•́ ₃ •̀๑)