Socket Io 在 Node js 中限制只有 6 个连接
Socket Io limiting only 6 connection in Node js
所以我遇到了 problem.I 我正在尝试将 {id} 发送到我的休息 API (节点 js),作为响应,我在套接字上获取数据。
问题:
前 5-6 次它工作得很好,显示 Id 并将数据发送回 socket.But,6 次后它没有获得 ID。
我试过了 https://github.com/socketio/socket.io/issues/1145
和 https://github.com/socketio/socket.io/issues/1145 但没有解决问题。
在重新编译服务器时,它显示我在 6 time.it 之后输入的前一个 {ids} 就像在 5-6 次之后它将 id 存储在某种形式的缓存中。
这是我的 API 路线。
//此路由只获取{id} 5-6次,5-6次后不再显示receing {id}。
const express = require("express");
var closeFlag = false;
const PORT = process.env.SERVER_PORT; //|| 3000;
const app = express();
var count = 1;
http = require('http');
http.globalAgent.maxSockets = 100;
http.Agent.maxSockets = 100;
const serverTCP = http.createServer(app)
// const tcpsock = require("socket.io")(serverTCP)
const tcpsock = require('socket.io')(serverTCP, {
cors: {
origin: '*',
}
, perMessageDeflate: false
});
app.post("/getchanneldata", (req, res) => {
console.log("count : "+count)
count++;// for debugging purpose
closeFlag = false;
var message = (req.body.val).toString()
console.log("message : "+message);
chanId = message;
client = dgram.createSocket({ type: 'udp4', reuseAddr: true });
client.on('listening', () => {
const address = client.address();
});
client.on('message', function (message1, remote) {
var arr = message1.toString().split(',');
}
});
client.send(message, 0, message.length, UDP_PORT, UDP_HOST, function (err, bytes) {
if (err) throw err;
console.log(message);
console.log('UDP client message sent to ' + UDP_HOST + ':' + UDP_PORT);
// message="";
});
client.on('disconnect', (msg) => {
client.Diconnected()
client.log(client.client)
})
}
);
这里有多个问题。
在您的 app.post()
处理程序中,您不会对传入的 http 请求发送任何响应。这意味着当浏览器(或任何客户端)向您的服务器发送 POST 时,客户端会坐在那里等待响应,但该响应永远不会到来。
同时,浏览器对同时发送到同一主机的请求数量有限制(我认为 Chrome 的限制恰好是 6)。一旦达到该限制,浏览器就会对请求进行排队,并等待先前的连接之一到 return 它的响应,然后再发送另一个连接。最终(经过很长时间),这些连接会超时,但这需要一段时间。
因此,首先要修复的是在您的 app.post()
处理程序中发送响应。即使你只是做 res.send("ok");
。这将允许第 7 次和第 8 次等请求立即发送到您的服务器。每个传入的 http 请求都应该有一个返回给它的响应,即使你没有什么可发送的,也只需执行 res.end()
。否则,http 连接将挂起,消耗资源并等待最终超时。
另外,您的 app.post()
处理程序包含以下内容:
client = dgram.createSocket({ type: 'udp4', reuseAddr: true });
这有几个问题。首先,你永远不会声明变量 client
所以它变成了一个隐式全局变量(这在服务器中非常糟糕)。这意味着对 app.post()
处理程序的连续调用将覆盖该变量。
其次,从包含的代码中不清楚何时关闭该 udp4 套接字(如果有的话)。服务器本身似乎并没有关闭它。
第三,您要在每个 POST 到 /getchanneldata
上重新创建相同的 UDP 套接字。这真的是正确的设计吗?如果您的服务器收到 20 个这样的请求,它将打开 20 个独立的 UDP 连接。
所以我遇到了 problem.I 我正在尝试将 {id} 发送到我的休息 API (节点 js),作为响应,我在套接字上获取数据。
问题: 前 5-6 次它工作得很好,显示 Id 并将数据发送回 socket.But,6 次后它没有获得 ID。 我试过了 https://github.com/socketio/socket.io/issues/1145 和 https://github.com/socketio/socket.io/issues/1145 但没有解决问题。 在重新编译服务器时,它显示我在 6 time.it 之后输入的前一个 {ids} 就像在 5-6 次之后它将 id 存储在某种形式的缓存中。 这是我的 API 路线。 //此路由只获取{id} 5-6次,5-6次后不再显示receing {id}。
const express = require("express");
var closeFlag = false;
const PORT = process.env.SERVER_PORT; //|| 3000;
const app = express();
var count = 1;
http = require('http');
http.globalAgent.maxSockets = 100;
http.Agent.maxSockets = 100;
const serverTCP = http.createServer(app)
// const tcpsock = require("socket.io")(serverTCP)
const tcpsock = require('socket.io')(serverTCP, {
cors: {
origin: '*',
}
, perMessageDeflate: false
});
app.post("/getchanneldata", (req, res) => {
console.log("count : "+count)
count++;// for debugging purpose
closeFlag = false;
var message = (req.body.val).toString()
console.log("message : "+message);
chanId = message;
client = dgram.createSocket({ type: 'udp4', reuseAddr: true });
client.on('listening', () => {
const address = client.address();
});
client.on('message', function (message1, remote) {
var arr = message1.toString().split(',');
}
});
client.send(message, 0, message.length, UDP_PORT, UDP_HOST, function (err, bytes) {
if (err) throw err;
console.log(message);
console.log('UDP client message sent to ' + UDP_HOST + ':' + UDP_PORT);
// message="";
});
client.on('disconnect', (msg) => {
client.Diconnected()
client.log(client.client)
})
}
);
这里有多个问题。
在您的 app.post()
处理程序中,您不会对传入的 http 请求发送任何响应。这意味着当浏览器(或任何客户端)向您的服务器发送 POST 时,客户端会坐在那里等待响应,但该响应永远不会到来。
同时,浏览器对同时发送到同一主机的请求数量有限制(我认为 Chrome 的限制恰好是 6)。一旦达到该限制,浏览器就会对请求进行排队,并等待先前的连接之一到 return 它的响应,然后再发送另一个连接。最终(经过很长时间),这些连接会超时,但这需要一段时间。
因此,首先要修复的是在您的 app.post()
处理程序中发送响应。即使你只是做 res.send("ok");
。这将允许第 7 次和第 8 次等请求立即发送到您的服务器。每个传入的 http 请求都应该有一个返回给它的响应,即使你没有什么可发送的,也只需执行 res.end()
。否则,http 连接将挂起,消耗资源并等待最终超时。
另外,您的 app.post()
处理程序包含以下内容:
client = dgram.createSocket({ type: 'udp4', reuseAddr: true });
这有几个问题。首先,你永远不会声明变量 client
所以它变成了一个隐式全局变量(这在服务器中非常糟糕)。这意味着对 app.post()
处理程序的连续调用将覆盖该变量。
其次,从包含的代码中不清楚何时关闭该 udp4 套接字(如果有的话)。服务器本身似乎并没有关闭它。
第三,您要在每个 POST 到 /getchanneldata
上重新创建相同的 UDP 套接字。这真的是正确的设计吗?如果您的服务器收到 20 个这样的请求,它将打开 20 个独立的 UDP 连接。