Skip to content

SocketIO实现

包子 edited this page Sep 17, 2019 · 1 revision

SocketIO抽象模型

SocketIO模型规定,一个服务端维护多个namespace,每个namespace有多个多个room,客户端连接是在room下的,一个客户端连接可以所属多个room,但只能所属一个namespace。客户端在创建链接时namespace确定,以后不能修改,但可以很灵活的加入或者离开room。

SocketIO实现项目隔离

根据上述SocketIO的抽象模型,一个连接只能属于一个namespace,可以利用namespace很容易的做到项目隔离。客户端创建链接时传入projectId,netty-socketio会自动维护好该连接所属项目。

var url = 'http://localhost:9095/' + projectId;
socket = io.connect(url, { forceNew: true })

SocketIO实现多播单播

根据上述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();
        }
    });
});
Clone this wiki locally