首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Socket Io仅限制节点js中的6个连接

Socket Io仅限制节点js中的6个连接
EN

Stack Overflow用户
提问于 2021-11-26 05:34:45
回答 1查看 76关注 0票数 1

因此我遇到了一个问题,我试图将{id}发送到我的rest (节点js),作为响应,我得到了套接字上的数据。

问题:最初5-6次运行非常好,显示ID并在6次后将数据发送回socket.But,没有得到Id。我尝试了这个https://github.com/socketio/socket.io/issues/1145https://github.com/socketio/socket.io/issues/1145,但没有解决问题。在重新编译服务器时,它显示了前面的{ id },我在6 time.it之后输入,就像5-6次之后,它将id存储在某种形式的缓存中。这是我的API路线。//此路由只获得{id} 5-6次.After 5-6次,不显示渐变{id}。

代码语言:javascript
运行
复制
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)


  })
}
);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-26 05:47:36

这里有很多问题。

app.post()处理程序中,不向传入的http请求发送任何响应。这意味着当浏览器(或任何客户端)向您的服务器发送帖子时,客户端坐在那里等待响应,但该响应从未出现。

同时,浏览器对同时发送到同一台主机的请求也有限制(我认为Chrome的限制恰好是6)。一旦达到此限制,浏览器将对请求进行排队,并等待前面的一个连接返回其响应,然后再发送另一个响应。最终(经过很长一段时间),这些连接将超时,但这需要一段时间。

因此,要修复的第一件事是在app.post()处理程序中发送响应。即使你只做res.send("ok");。这将允许第7和第8次等请求立即发送到您的服务器。每个传入的http请求都应该有一个响应发送回它,即使您没有什么可发送的,只需执行一个res.end()。否则,http连接将被挂起,消耗资源并等待最终超时。

在另一个注释中,您的app.post()处理程序包含以下内容:

代码语言:javascript
运行
复制
client = dgram.createSocket({ type: 'udp4', reuseAddr: true });

这有几个问题。首先,您从不声明变量client,这样它就变成了隐式全局(在服务器中非常糟糕)。这意味着对app.post()处理程序的连续调用将覆盖该变量。

第二,从包含的代码中不清楚何时关闭udp4套接字。服务器本身似乎从未关闭过它。

第三,在/getchanneldata的每个帖子上都要重新创建相同的UDP套接字。这真的是正确的设计吗?如果您的服务器收到其中的20个请求,它将打开20个单独的UDP连接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70119967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档