排版若乱掉,请参考https://www.zybuluo.com/bornkiller/note/5273javascript
<script src="/socket.io/socket.io.js"></script>
官方示例,使人迷惑。查阅得知,socket.io 库会拦截/socket.io开始的全部路径,当作普通http请求进行响应,返回文件须要通过服务器端处理,我用浏览器保存了一份http://snowykiss.qiniudn.com/socket.io.js,方便查阅。java
var io = require('socket.io').listen(1338); io.sockets.on('connection', function (socket) { socket.on('test', function (data) { socket.broadcast.emit('love',{'title' : 'I LOVE you forever...' ,'reason' : 'unbelieve' }); }); });
var socket = io.connect('http://127.0.0.1:1338') socket.on('love',function(data){ console.log(data); })
这里的broadcast会向其它全部链接到此端口的client side发送消息.web
var io = require('socket.io').listen(1338); io.of('/some').on('connection', function (socket) { socket.on('test', function (data) { socket.broadcast.emit('love',{'title' : 'I LOVE you forever...' ,'reason' : 'unbelieve' }); }); });
var socket = io.connect('http://127.0.0.1:1338/some') socket.on('love',function(data){ console.log(data); })
这里的broadcast只会向url参数为http://127.0.0.1:1338/some发送消息,虽然全部的链接都是websocket--http://127.0.0.1:1338/的链接。浏览器
若是不想使用自定义事件,经过socket.emit('customEvent',data)
的方式推送消息,官方支持socket.send()方法。服务器端经过socket.on('message',function(data){})
,浏览器端一样经过socket.on('message',function(data){})
获取数据,注意这是预置的事件。服务器
Worker模式
不知道websocket对浏览器的压力是否过大,若是担忧websocket进程压力,能够启用worker模式,不过须要将socket.io事件封装方式,经过worker.postMessage()配合Worker message Event从新封装一遍,感受挺鸡肋。websocket
importScripts('socket.io.js'); var socket = io.connect('http://127.0.0.1:1338/'); var self = this; socket.on('butterfly',function(data){ self.postMessage({"name" : "butterfly","data" : data}); }); socket.on('love',function(data){ self.postMessage({"name" : "love","data" : data}); })
下面是我用Worker微扩展测试,声明新的Worker对象后,就能够监听自定义伪事件,跟socket.io保持同步的on方法,其它伪事件监听应该类似,不作衍生说明socket
Worker.prototype.reg = {}; Worker.prototype.on = function (event,fn) { if (!this.reg[event]) { this.reg[event] = fn; } else if (typeof(this.reg[event]) == 'array') { this.reg[event].push(fn); } else { this.reg[event] = [this.reg[event], fn]; } }; var story = new Worker('lover.js'); story.on('love',function(e){ console.log(e.data); }) story.addEventListener('message', function (e) { if(e.data.name){ this.reg[e.data.name].call(this, e.data); } });