首先配置好服务器
... ... //前面省略 ... var server = app.listen(app.get('port'), function() { console.log('node 正在运行,端口:'+app.get('port')); }); var io = require('socket.io')(server, { pingTimeout: 5000, pingInterval: 10000 }) io.on('connection', function(socket) { console.log(socket.id) socket.on('disconnect', () => { for(var i in oSocketIDs) { if(oSocketIDs[i] === socket.id) { delete(oSocketIDs[i]); } } delete(oSockets[socket.id]) }) socket.on('chat message',(msg, fn) => { io.emit('chat message', msg); fn('success') }) })
然后客户端需要配置socket
<body> <ul id="messages"></ul> <form action=""> <input id="m" autocomplete="off" /><button>Send</button> </form> <script src="/socket.io/socket.io.js"></script> <script src="https://code.jquery.com/jquery-1.11.1.js"></script> <!-- 如果socket.io.js 和服务器不在一个域下面,则需要指定详细地址 --> <!-- <script src='http://localhost:8888/socket.io/socket.io.js'></script> --> <script> var socket = io(); // 如果socket.io.js 和服务器不在一个域下面,则需要指定详细地址 // var socket = io('http://localhost:8888') $('form').submit(function(event) { event.preventDefault(); socket.emit('chat message', $('#m').val()); return false; }); socket.on('chat message', function(msg) { $('#messages').append($('<li>').text(msg)); }) $.ajax({ url: '/test', type: 'get', data: {param1: 'value1'} }) .done(function() { console.log("success"); }) .fail(function() { console.log("error"); }) .always(function() { console.log("complete"); }); </script> </body>
- 客户端手动断开socket, 使用socket.close(); 手动重连socket.open();
- socket监听事件,使用socket.on();
- 服务端广播消息,io.emit:广播全部包括自己, socket.broadcast.emit: 广播全部不包括自己
socket.io 实现点对点发送消息
实现方式:在io.on(‘connection’)的时候,所有的socket按照某种关键字保存起来, 比如一个对象oSockets。做{username: socket} 的对应关系。然后在服务器端监听到某个私有消息事件的时候,根据客户端指定的username,选择oSockets[username].emit(…)就行了
// 完整代码 // 服务端 var oSocketIDs = {}; var oSockets = {}; io.on('connection', function(socket) { socket.on('create user', (username) => { console.log(username) oSockets[username] = socket; oSocketIDs[username] = socket.id; socket.emit('find user', oSocketIDs); }) console.log(socket.id) socket.on('disconnect', () => { // 断开的时候删除oSocket的相应内容 for(var i in oSocketIDs) { if(oSocketIDs[i] === socket.id) { delete(oSocketIDs[i]); delete(oSockets[i]) } } }) socket.on('private message', (from, to, data, fn) => { oSockets[to].emit('private msg', data) // to 就代表要发送的某个用户 }) socket.on('private filedata', (from, to ,data, fn) => { if(!to) { fn('error'); return; } oSockets[to].emit('receive private file', data) fn('success') }) }) // 客户端 window.socket.emit('private message', from , to, data,(ack) => { ack === 'success' && message.success('私信成功'); });