您的位置:首页 > Web前端 > JavaScript

[js]socket.io最简单的例子

2018-01-31 16:07 399 查看
很久没写博,最近用到了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 测试成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息