Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 带有apache的Socket.io-套接字客户端1 id在连接客户端2时刷新_Node.js_Apache_Websocket_Socket.io_Cakephp 3.0 - Fatal编程技术网

Node.js 带有apache的Socket.io-套接字客户端1 id在连接客户端2时刷新

Node.js 带有apache的Socket.io-套接字客户端1 id在连接客户端2时刷新,node.js,apache,websocket,socket.io,cakephp-3.0,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(""

我在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');
});
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);
});
客户端javascript(Client.js)置于default.ctp(CakePHP默认呈现布局)

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');
});
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);
});
var nodeToken=”“;
变量套接字=io('http://localhost/node“,{secure:true,query:{token:nodeToken}});
socket.on('connect_error',function(){
console.log('无法连接);
});
当客户端通过
连接到节点服务器时,工作流按预期工作http://localhost:2105

但是在将代码移植到生产环境时,我使用了apache(v2.4.7)来屏蔽端口,使用
代理传递
重写
将任何请求转发到
http://localhost/node
Apache2配置

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');
});
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);
});
通过apache连接到节点后,初始连接成功建立,客户端将按预期从节点服务器接收响应。在default.ctp中写入套接字客户端连接时,到节点服务器的连接会在每次页面刷新时刷新,或使用相同的default.ctp布局重定向到任何其他视图

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

如果不使用apache,并且节点服务器直接连接到client.js中的端口,那么一切都按预期工作,因此我怀疑apache2
代理传递配置中一定存在一些问题。我已经启用了
mod_proxy
mod_ws_proxy
模块


任何帮助都将不胜感激。

在大量搜索和浏览之后,我发现在重新加载页面后,或者在我的情况下,default.ctp layout用于另一个视图渲染,套接字连接被意外终止

因此,我通过维护3个阵列来保存,解决了这个问题:

  • 用户=>套接字IDSs
  • 套接字ID=>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;
  });
另外,在客户端,我将在套接字连接事件上发出start事件,因此在建立新连接后,该事件将被重新注册到新套接字

如果直接建立到节点的连接而不使用Apache代理传递中间件,则不需要所有配置