记录一下方便后面查阅



//使用与触发流程
io.sockets.on('connection', function (socket) {
    //回调函数的socket参数为一个 client 与服务器的连接标示,不同的 client 会有不同的连接标示。
    //每次新建连接会有socket.id作为全局唯一标识
    console.log('a user connected');

    //用户注销链接
    socket.on('disconnect',()=> {
        if (socket.user != null) {
            console.log('logout');
        }
    });
    //判断用户重新连接
    if(socket.handshake.query.User){
        let user=JSON.parse(socket.handshake.query.User);
        if(user.id){
            socket.user = user;
            user.roomId = socket.id;
            user.address = socket.handshake.address.replace(/::ffff:/,"");
            console.log("用户<"+user.name+">重新连接成功!")
        }else {
            console.log("非法链接用户")
        }
    }
});

/*=======不分组,数据传输========*/
// 信息传输对象为当前 socket 对应的 client ,各个client socket 相互不影响
socket.emit('message', "this is a test");

// 信息传输对象为所有 client ,排除当前socket 对应的 client
socket.broadcast.emit('message', "this is a test");

//信息传输对象为所有 client
io.sockets.emit

//对指定 client 信息传输
socket.broadcast.to(to.roomId).emit

/*=======分组数据传输========*/
//socket.io 可以使用分组方法, socket.join() ,以及与之对应的 socket.leave() 。
io.sockets.on('connection', function (socket) {
  socket.on('firefox', function (data) {
    socket.join('firefox');
  });
  socket.on('chrome',function(data){
    socket.join('chrome');
  });
});
//假设有两个聊天室,一个名为firefox,另一个为chrome,客户端操作
socket.emit('firefox') ,就可以加入 firefox 聊天室;
socket.emit('chrome') ,就可以加入 chrome 聊天室;

//向一个分组传输消息,有两种方式:
socket.broadcast.to('chrome').emit('event_name', data);
//broadcast 方法允许当前 socket client 不在该分组内。
io.sockets.in('chrome').emit('event_name', data)

//一个 socket 是否可以同时存在于几个分组,等效于一个用户会同时在几个聊天室活跃, socket.join() 添加进去就可以了。
//官方提供了订阅模式的示例:
//后台处理订阅/退订事件
socket.on('subscribe', function(data) { 
    //订阅
    socket.join(data.room);
})
socket.on('unsubscribe', function(data) { 
    //退订
    socket.leave(data.room);
})

//前端触发订阅/退订事件,就可以加入对应的聊天室
//(通过 of 方法也可以通过划分命名空间的方式,实现聊天室功能,但不如分组管理来的方便。)
socket = io.connect('http://127.0.0.1:3030/');
socket.emit('subscribe',{"room" : "chrome"};
socket.emit('unsubscribe',{"room" : "chrome"};



apache设置https转发,详情可点击

#apache设置转发
#开启扩展
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
#配置如下:
<VirtualHost *:443>
	ServerAdmin tony@163.com
    ServerName test.abc.com
    SSLEngine on
    SSLCertificateFile "${SRVROOT}/cert/abc_public.crt"
	SSLCertificateKeyFile "${SRVROOT}/cert/abc.key"
	SSLCertificateChainFile "${SRVROOT}/cert/abc_chain.crt"
    ProxyRequests off
    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
    RewriteCond %{QUERY_STRING} transport=websocket    [NC]
    RewriteRule /(.*)           ws://127.0.0.1:3030/$1 [P,L]
    ProxyPass /  http://127.0.0.1:3030/
    ProxyPassReverse / http://127.0.0.1:3030/
</VirtualHost>


评论  表情