所以我遇到了一個問題。我試圖將 {id} 發送到我的其余 API(節點 js),作為回應,我在套接字上獲取資料。
問題: 前 5-6 次它作業得很好并顯示 Id 并將資料發送回套接字。但 6 次后它沒有得到 ID。我試過這個https://github.com/socketio/socket.io/issues/1145 和 https://github.com/socketio/socket.io/issues/1145但沒有解決問題。在重新編譯服務器時,它會顯示我在 6 次之后輸入的先前 {ids}。就像在 5-6 次之后,它以某種形式的快取存盤 id。這是我的 API 路線。//這條路線只獲得{id} 5-6次。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)
})
}
);
uj5u.com熱心網友回復:
這里有多個問題。
在您的app.post()處理程式中,您不會對傳入的 http 請求發送任何回應。這意味著當瀏覽器(或任何客戶端)向您的服務器發送 POST 時,客戶端坐在那里等待回應,但該回應永遠不會到來。
同時,瀏覽器對同時向同一主機發送的請求數量有限制(我認為 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 套接字。服務器本身似乎從未關閉它。
第三,您在每次 POST 到/getchanneldata. 這真的是正確的設計嗎?如果您的服務器收到其中的 20 個請求,它將打開 20 個單獨的 UDP 連接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/367416.html
