-
Notifications
You must be signed in to change notification settings - Fork 1
SocketIO实现
包子 edited this page Sep 17, 2019
·
1 revision
SocketIO模型规定,一个服务端维护多个namespace,每个namespace有多个多个room,客户端连接是在room下的,一个客户端连接可以所属多个room,但只能所属一个namespace。客户端在创建链接时namespace确定,以后不能修改,但可以很灵活的加入或者离开room。
根据上述SocketIO的抽象模型,一个连接只能属于一个namespace,可以利用namespace很容易的做到项目隔离。客户端创建链接时传入projectId,netty-socketio会自动维护好该连接所属项目。
var url = 'http://localhost:9095/' + projectId;
socket = io.connect(url, { forceNew: true })
根据上述SocketIO的抽象模型,客户端可以所属一个或多个room,而且可以很灵活的加入或离开room。所谓实现多播,就是给一个room下的所有客户端发送消息。而实现单播需要业务方定义一个和客户端唯一的room,比如客户端id。socket.io.java.server.biz把加入room定义为订阅。
socket.io.java.server.biz约定在建立后连接,鉴权成功后才接受订阅消息。你可以用如下代码给客户端订阅不同的主题(实际则是加入到不同的room中)。
var _subscribes = [$("#topic_1").val(), $("#topic_2").val()];
var _authData = {projectId: projectId, token: token};
socket.on('connect', function () {
// 2. 认证
socket.emit('auth', _authData, function (authCode) {
console.log("auth ack code:" + authCode);
// 1.1 认证成功发起订阅
if (authCode === 'auth_success') {
socket.emit('subscribe', _subscribes, function (subscribeCode) {
console.info('sub ack code:' + subscribeCode);
if (subscribeCode === "sub_success") {
setConnected(true);
} else {
disconnect();
}
});
} else {
// 1.2 认证失败关闭连接
disconnect();
}
});
});