Socket.io with apache - socket client 1 id刷新连接客户端2

时间:2017-06-22 12:43:19

标签: node.js apache websocket socket.io cakephp-3.0

我在cakephp3应用程序中使用socket.io来显示已连接客户端的已处理请求的状态。

套接字脚本(Server.js)

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var jsdom = require("jsdom");
const { JSDOM } = jsdom;

var dom = new JSDOM("");
var $ = require("jquery")(dom.window);

io.on('connection', function(socket){
  console.log('A user connected');

  socket.on('Event 1', function(data, fn){

    // Data received successfully!!!
    fn();
    // Processing
    sock.emit('Return 1', {data});
  });
  socket.on('disconnect', function(){
    console.log('A user disconnected');
  });
  socket.on('Event 2', function(data){
    // Processing
    var uid = data['uid']; //adding same user socket
    if(!sockets_uid[uid]){
        sockets_uid[uid] = [];
    }
    sockets_uid[uid].push(socket);
    $.each(sockets_uid, function(i, sock){
        sock.emit('Return 2', res);  
    });                 
});

http.listen(2105, function(){
    console.log('Started on 2105');
});

客户端javascript(client.js)置于 default.ctp(CakePHP默认呈现布局)

var nodeToken = "<?= $this->request->session()->read('nodeToken');?>";
var socket = io('http://localhost/node', {secure: true, query: {token: nodeToken}});
socket.on('connect_error', function(){
    console.log('Unable to connect);
});

当客户端通过http://localhost:2105连接到节点服务器时,工作流正在按预期工作。

但是在将代码移植到生产环境时,我使用 apache(v2.4.7)来使用Proxy Passrewrite来屏蔽端口以将任何请求转发到{{1 }}。 Apache2配置

通过apache连接到节点后,初始连接成功建立,客户端正在按预期从节点服务器接收响应。正在使用default.ctp编写套接字客户端连接时,与每个页面刷新的节点服务器连接将刷新,或使用相同的default.ctp布局重定向到任何其他视图。

我面临的问题是,只要执行某些操作 - 比如调用另一个视图ctp,父客户端就无法接收节点服务器推送给客户端的任何更新。

如果没有使用apache且节点服务器直接与client.js中的端口连接,那么一切都按预期工作,所以我怀疑apache2 http://localhost/node配置中一定存在一些问题。我已启用proxy passmod_proxy个模块。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

经过大量的谷歌搜索和浏览后,我发现重新加载页面后,或者在我的情况下,default.ctp布局用于另一个视图渲染,套接字连接被非正常终止

所以,我通过维护3个数组来解决这个问题:

  • Users =&gt;套接字的入侵检测系统
  • Sockets-IDs =&gt;套接字,和
  • 所有活动套接字

现在,在页面刷新/套接字断开时,我删除了旧的终止套接字并仅将事件发送到新套接字。

socket.on('disconnect', function(){
    var socket_id = socket.id;
    var uid = uids_sockets[socket_id];
    delete sockets[socket_id];
    var temp_array = sockets_uid[uid];
    var index = temp_array.indexOf(socket_id);
    temp_array.splice(index, 1);
    sockets_uid[uid] = temp_array;
  });

此外,在客户端,我在套接字连接事件上发出启动事件,因此在建立新连接后,事件将重新注册到新套接字。

如果直接建立与节点的连接而不使用 Apache Proxy-pass Middleware ,则不需要所有配置。