我在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 Pass
和rewrite
来屏蔽端口以将任何请求转发到{{1 }}。
Apache2配置:
通过apache连接到节点后,初始连接成功建立,客户端正在按预期从节点服务器接收响应。正在使用default.ctp编写套接字客户端连接时,与每个页面刷新的节点服务器连接将刷新,或使用相同的default.ctp布局重定向到任何其他视图。
我面临的问题是,只要执行某些操作 - 比如调用另一个视图ctp,父客户端就无法接收节点服务器推送给客户端的任何更新。
如果没有使用apache且节点服务器直接与client.js中的端口连接,那么一切都按预期工作,所以我怀疑apache2 http://localhost/node
配置中一定存在一些问题。我已启用proxy pass
和mod_proxy
个模块。
任何帮助都将受到高度赞赏。
答案 0 :(得分:3)
经过大量的谷歌搜索和浏览后,我发现重新加载页面后,或者在我的情况下,default.ctp布局用于另一个视图渲染,套接字连接被非正常终止。
所以,我通过维护3个数组来解决这个问题:
现在,在页面刷新/套接字断开时,我删除了旧的终止套接字并仅将事件发送到新套接字。
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 ,则不需要所有配置。