【问题标题】:Socket.io with apache - socket client 1 id refreshes on connecting client 2带有 apache 的 Socket.io - 连接客户端 2 时套接字客户端 1 id 刷新
【发布时间】:2017-06-22 12:43:19
【问题描述】:

我在我的 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 将任何请求转发到 http://localhost/nodeApache2 配置

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

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

如果不使用 apache 并且节点服务器直接与 client.js 中的端口连接,那么一切都按预期工作,所以我怀疑 apache2 proxy pass 配置中一定有问题。我已经启用了mod_proxymod_ws_proxy 模块。

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

    • 用户 => 套接字-IDS
    • Sockets-IDs => Sockets,和
    • 所有活动套接字

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

    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直接建立与节点的连接,则不需要所有配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      相关资源
      最近更新 更多