记录一下方便后面查阅
//使用与触发流程
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
#配置如下:
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/