gpt4 book ai didi

node.js - Socket.io 多个响应而不是一个

转载 作者:太空宇宙 更新时间:2023-11-03 23:53:58 25 4
gpt4 key购买 nike

我遇到了 socket.io 和 Node js 的问题。

上下文

我有两台服务器,其中一台正在处理繁重的工作,另一台正在响应客户端。主要情况如下:

  1. 客户端请求数据
  2. “中间服务器”会查看数据库中是否有此数据。如果没有,它会向第二个服务器发送请求
  3. 第二台服务器执行研究。
  4. 完成后,第二个服务器将数据推送到“中间服务器”
  5. 中间服务器最终将数据推送到客户端(并为将来的客户端请求保留数据)

这是示例代码

客户端

<script type="text/javascript"/>
var socket = io('https://localhost:9091', {'forceNew': true);
// send a request to the mid server
socket.emit('request', data);

socket.on('response', async (response) => {
// when the mid server responds, the response is printed
$('#container').append(response);
});
</script>

中间服务器

const app = require('express')();
const http = require('http').createServer(app);
const io = require('socket.io')(http);

// in order to use this server as a Socket.io client
const secondServer = require('socket.io-client').connect('http://localhost:9092');

app.set('view engine', 'ejs');

app.get('/', (req, res) => {
res.render('index', {})
});

io.on('connection', async (socket) => {

console.log('User connected');

// On client request
socket.on('request', async (data) => {

console.log('Requesting from ' + socket.id);

// The same request is transmited to the second server
secondServer.emit('request', data);
});

// Once the second server has finished his job
secondServer.on('response', async (data) => {

console.log('Responding for ' + socket.id);

// I send the data back to the client
socket.emit('response', data);
});

socket.on('disconnect', () => {
socket.disconnect();
});
});

// port is 9091
http.listen(port, () => {
console.log('Server listening on port ' + port);
});

第二台服务器

const io = require("socket.io").listen(9092);

io.on("connection", function (socket) {

socket.on('request', async () => {
// await in order to wait the heavyJob to be done before sending the response
var data = await heavyJob()

// Send back the data to the mid server
socket.emit('response', data);

});
});

问题

我面临的问题是,如果我刷新客户端页面,中间服务器将发送两次数据,一次发送到旧套接字,一次发送到新套接字,如下所示:

console output

我还尝试在中间服务器端使用 socket.emit('response', data) 和在客户端使用 socket.on('response', (data) => {}) 来响应客户端,而不是使用 callback 函数。它不会改变任何东西。

我是否误解了什么?

感谢您的帮助

编辑

这不仅仅发生在客户端刷新页面时。当两个不同的客户端同时发送请求时就会发生这种情况。服务器响应四次,每个客户端响应两次。

console output

最佳答案

你是对的,Nico,我没有意识到回调无法到达。这是我的错误。

根据您编辑的代码,您可以从"io.on('connection'"的回调中拉出"secondServer.on('response'.."

您可以尝试以下操作,希望对您有所帮助。

中间服务器

io.on('connection', async (socket) => {

console.log('User connected');

// On client request
socket.on('request', async (data) => {

console.log('Requesting from ' + socket.id);

// The same request is transmited to the second server
// give data and socket.id to secondServer.
secondServer.emit('request', {data:data, id:socket.id});
});

// Once the second server has finished his job
socket.on('disconnect', () => {
socket.disconnect();
});
});

secondServer.on('response', async (reply) => {
const {id, data} = reply;
console.log('Responding for ' + id);
// I send the data back to the client
io.to(id).emit('response', data);
});

第二个服务器

const io = require("socket.io").listen(9092);

io.on("connection", function (socket) {

socket.on('request', async (req) => {
// await in order to wait the heavyJob to be done before sending the response
const {id} = req;
var data = await heavyJob();
const reply = { id, data };
// Send back the data to the mid server
socket.emit('response', reply);

});
});
<小时/>

我认为你需要从“socket.on('request',...”回调中提取“secondServer.on('response'..”代码。

io.on('connection', async (socket) => {

console.log('User connected');
// On client request
socket.on('request', async (data, callback) => {

console.log('Requesting from ' + socket.id);
// The same request is transmited to the second server
secondServer.emit('request', data);
});
secondServer.on('response', async (data) => {
console.log('Responding for ' + socket.id);
callback(data.images);
});
});

关于node.js - Socket.io 多个响应而不是一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58244187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com