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

很久没写博,最近用到了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 测试成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值