因此我遇到了一个问题,我试图将{id}发送到我的rest (节点js),作为响应,我得到了套接字上的数据。
问题:最初5-6次运行非常好,显示ID并在6次后将数据发送回socket.But,没有得到Id。我尝试了这个https://github.com/socketio/socket.io/issues/1145和https://github.com/socketio/socket.io/issues/1145,但没有解决问题。在重新编译服务器时,它显示了前面的{ id },我在6 time.it之后输入,就像5-6次之后,它将id存储在某种形式的缓存中。这是我的API路线。//此路由只获得{id} 5-6次.After 5-6次,不显示渐变{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)
})
}
);
发布于 2021-11-26 05:47:36
这里有很多问题。
在app.post()
处理程序中,不向传入的http请求发送任何响应。这意味着当浏览器(或任何客户端)向您的服务器发送帖子时,客户端坐在那里等待响应,但该响应从未出现。
同时,浏览器对同时发送到同一台主机的请求也有限制(我认为Chrome的限制恰好是6)。一旦达到此限制,浏览器将对请求进行排队,并等待前面的一个连接返回其响应,然后再发送另一个响应。最终(经过很长一段时间),这些连接将超时,但这需要一段时间。
因此,要修复的第一件事是在app.post()
处理程序中发送响应。即使你只做res.send("ok");
。这将允许第7和第8次等请求立即发送到您的服务器。每个传入的http请求都应该有一个响应发送回它,即使您没有什么可发送的,只需执行一个res.end()
。否则,http连接将被挂起,消耗资源并等待最终超时。
在另一个注释中,您的app.post()
处理程序包含以下内容:
client = dgram.createSocket({ type: 'udp4', reuseAddr: true });
这有几个问题。首先,您从不声明变量client
,这样它就变成了隐式全局(在服务器中非常糟糕)。这意味着对app.post()
处理程序的连续调用将覆盖该变量。
第二,从包含的代码中不清楚何时关闭udp4套接字。服务器本身似乎从未关闭过它。
第三,在/getchanneldata
的每个帖子上都要重新创建相同的UDP套接字。这真的是正确的设计吗?如果您的服务器收到其中的20个请求,它将打开20个单独的UDP连接。
https://stackoverflow.com/questions/70119967
复制相似问题