很久没写博,最近用到了socket.io,在网上找了挺多例子都不太好懂,于是自己查了文档写了个示例,仅当笔记记录到CSDN。
socket.io/socket.io-client文档地址:https://github.com/socketio/socket.io/tree/master/docs
服务器示例代码:
'use strict';
const socket_io = require('socket.io');
const http = require('http');
const server = http.createServer();
const io = socket_io(server, {
path : '/',
// pingTimeout : 60000,
// pingInterval : 25000, // 默认每隔 25 秒向客户端发一次 ping 消息
});
var sockets = {};
process.on('SIGINT', () =>
{
// 不断开与客户端的连接,则客户端默认会每隔 1~5 秒自动发起一次对服务器的重连
// for (let id in sockets)
// {
// sockets[id].removeAllListeners();
// sockets[id].disconnect(true);
// }
// 关闭 socket.io 服务器,不再接受客户端连接
server.close();
});
// 客户端回调
var cli_cb = function (...args)
{
console.log('client callback:', ...args);
};
// 广播消息到除 socket 外的客户端
var broadcast = function (socket, event, ...args)
{
socket.broadcast.emit(event, ...args);
};
io.on('connect', (socket) =>
{
console.log('connection:', socket.id);
sockets[socket.id] = socket;
// 给刚建立连接的 server 客户端发送消息
socket.emit('cli_event', socket.id, Math.random(), cli_cb);
// 广播到除客户端 socket 自身外已连接 server 的所有客户端
broadcast(socket, 'cli_broadcast', socket.id, { hello : socket.id, world : { lilei : undefined } });
// 广播到所有连接 server 的客户端
io.emit('cli_whole', socket.id, { hello : 'wolrd' });
// 处理客户端发来的消息
socket.on('srv_event', (id, param, fn_ack) =>
{
console.log('%s srv_event', socket.id, id, param);
// 向客户端回复消息
if (fn_ack)
{
fn_ack(socket.id, { srv_rpc : Math.random() });
}
});
socket.on('disconnect', (reason) =>
{
broadcast(socket, 'cli_closed', socket.id);
console.log('%s disconnected: %s', socket.id, reason);
socket.removeAllListeners();
socket.disconnect(true);
delete sockets[socket.id];
})
.on('error', (err) =>
{
console.log('error: %s', err.stack);
});
});
server.listen(12345);
客户端示例代码:
'use strict'
const socket_io_client = require('socket.io-client');
const socket = socket_io_client('http://127.0.0.1:12345');
// const socket = socket_io_client('http://182.254.229.133:12345');
process.on('SIGINT', () =>
{
socket.disconnect();
});
// 服务器回复的消息
var srv_cb = function (...args)
{
console.log('server callback:', ...args);
};
socket.on('connect', () =>
{
console.log('%s connected', socket.id);
})
.on('disconnect', (reason) =>
{
console.log('Disconnected: %s', reason);
socket.disconnect();
})
.on('reconnect', (attempt) => // 重连成功会触发此事件
{
// attempt 为尝试重连的次数
console.log('reconnect', attempt);
})
.on('reconnect_attempt', () =>
{
console.log('reconnect_attempt');
})
.on('reconnecting', (attempt) => // 正在重连时会触发此事件
{
console.log('reconnecting', attempt);
})
.on('reconnect_error', (err) =>
{
console.log('reconnect_error', err);
})
.on('reconnect_failed', () =>
{
console.log('reconnect_failed');
})
.on('ping', () =>
{
console.log('ping received');
})
.on('pong', (latency) =>
{
// latency 为从发送 ping 后到收到服务器回应 pong 中间间隔的毫秒数
console.log('pong %d ms', latency);
})
.on('error', (err) =>
{
console.log('error: %s', err.stack);
})
// 服务器发来一般消息
.on('cli_event', (id, param, fn_ack) =>
{
console.log('%s cli_event', id, param);
socket.emit('srv_event', socket.id, param, srv_cb);
// 回复服务器消息
if (fn_ack)
{
fn_ack(socket.id, { client : Math.random() });
}
})
// 服务器发来其他客户端消息
.on('cli_broadcast', (id, ...args) =>
{
console.log('%s cli_broadcast', id, ...args);
})
// 服务器发来广播消息
.on('cli_whole', (id, ...args) =>
{
console.log('%s cli_whole', id, ...args);
})
// 服务器要求客户端断开连接
.on('cli_closed', (id) =>
{
console.log('cli_closed', id);
socket.disconnect();
});
node v6.11.2 + socket.io v2.0.4 测试成功