gpt4 book ai didi

javascript - Node.js 服务中的 socket.io 事件使用的套接字

转载 作者:太空宇宙 更新时间:2023-11-04 01:05:31 24 4
gpt4 key购买 nike

恐怕这很难解释,说实话,我真的不能指望有人经历这一切,但我不知道还能如何解释。

我似乎在将用户名链接到 node.js socket.io 服务中的套接字时遇到问题。我找到了一个相当标准的聊天示例,并根据我的需要对其进行了修改,并得到了

一直在尝试从 JavaScript 客户端测试其性能。客户端应用程序有一个用户界面,允许它指定要建立的连接数,然后点击

按钮打开所有连接。当客户端中触发连接事件时,我会发送用户名(“用户”+连接号)并尝试在服务器上处理此问题。

在客户端中,我在连接时使用“强制新连接”选项,以便使用新连接而不是重新使用以前的连接。我这样做是为了允许

性能待测试。

我遇到的问题是服务器上使用的事件似乎有错误的套接字对象(最后一个连接的客户端)。我有点明白为什么会发生这种情况

异步原因,但我无法解决它。这是我的小型服务器应用程序:

var httpd = require('http').createServer();
var io = require('socket.io').listen(httpd);
io.sockets.on('connection', function (socket) {

noOfConnections = noOfConnections + 1;
console.log('SocketID ' + socket.id + ' connected. Connections = ' + noOfConnections);

socket.on('login', function(UserName) {
socket.set('UserName', UserName, function(err) {
if (err) { throw err; }
io.sockets.socket(socket.id).emit('serverMessage', 'SocketID (' + socket.id + ') Currently logged in as ' + UserName);
console.log('SocketID (' + socket.id + ') ' + UserName + ' logged in. Connections = ' + noOfConnections);
})
});

});

httpd.listen(3000);
console.log("Server listening on port 3000");

var noOfConnections = 0;

客户端应用程序的相关部分如下:

    for (var index = 0; index < noOfConnections; index++) {
var socket = io.connect('http://192.168.0.12:3000', { 'force new connection': true });

socket.on('connect', function () {
userNo = userNo + 1;

addMessage("Socket connected Server SocketId = " + socket.socket.sessionid);

var username = userNamePrefix + userNo
socket.emit('login', username);
});

}
},

我将大量数据写入服务器控制台并将一些数据返回到客户端,以便它显示在客户端浏览器中。如果客户端建立 5 个连接,我会在服务器上看到这一点

控制台:

Server listening on port 3000
SocketID i0M_578QQZcT0q9yraV_ connected. Connections = 1
SocketID 0c1l31sGy8sl1DkPraWA connected. Connections = 2
SocketID BEmhxokbfd95K-lGraWB connected. Connections = 3
SocketID i0UD5Prnkcu_o29araWC connected. Connections = 4
SocketID mbOSMts7JLCYlT6eraWD connected. Connections = 5
SocketID (mbOSMts7JLCYlT6eraWD) User1 logged in. Connections = 5
SocketID (mbOSMts7JLCYlT6eraWD) User2 logged in. Connections = 5
SocketID (mbOSMts7JLCYlT6eraWD) User3 logged in. Connections = 5
SocketID (mbOSMts7JLCYlT6eraWD) User4 logged in. Connections = 5
SocketID (mbOSMts7JLCYlT6eraWD) User5 logged in. Connections = 5

前 5 个连接消息中显示的 socket.id,看起来很棒!正如我所期望的那样,它们都不同。

客户端登录时下一条消息的套接字 ID 为每个登录用户显示相同的(最后一个连接)套接字 ID。这意味着我无法根据

设置用户名

socket 因为用户名都与同一个套接字关联。

客户端浏览器屏幕如下:

Socket connected Server SocketId = mbOSMts7JLCYlT6eraWD
Socket connected Server SocketId = mbOSMts7JLCYlT6eraWD
Socket connected Server SocketId = mbOSMts7JLCYlT6eraWD
Socket connected Server SocketId = mbOSMts7JLCYlT6eraWD
Socket connected Server SocketId = mbOSMts7JLCYlT6eraWD
SocketID (mbOSMts7JLCYlT6eraWD) Currently logged in as User1
SocketID (mbOSMts7JLCYlT6eraWD) Currently logged in as User2
SocketID (mbOSMts7JLCYlT6eraWD) Currently logged in as User3
SocketID (mbOSMts7JLCYlT6eraWD) Currently logged in as User4
SocketID (mbOSMts7JLCYlT6eraWD) Currently logged in as User5

前 5 条消息来自客户端套接字连接事件,并显示 5 个连接的服务器套接字 ID 均相同。这意味着登录套接字不在

错误,但客户端的连接对最后一个套接字触发 5 次,而不是对每个客户端套接字触发一次。然后登录发生在

的那个套接字上

客户端,因此当它在服务器上触发时是错误的。

那么服务器代码是否有可能没有错误,问题是我在客户端的 for 循环?这种类型的 for 循环在异步世界中是不行的吗?

非常欢迎任何建议或见解,因为我已经在这方面花了很长时间。

谢谢

最佳答案

这是您的客户端的问题。两个重要的点是,只有函数在 javascript 中创建新作用域(具体来说,for 循环不会),以及 javascript 中闭包的工作方式 - 它们捕获变量,而不是变量的内容。

所以,发生的情况是循环的每次迭代都使用相同的 socket 变量,但将其设置为不同的套接字,因此当循环结束时,一个 socket变量包含最后创建的套接字。然后,一旦套接字的 connected 事件触发,它们都会在同一个socket(最后一个)上发出。

您需要创建一个 IIFE,通过创建新的作用域,为循环的每次运行单独捕获 socket 变量:

for (var index = 0; index < noOfConnections; index++) {
(function(socket) {
socket.on('connect', function () {
userNo = userNo + 1;

if (showDataMessages) {
addMessage("Socket connected Server SocketId = " + socket.socket.sessionid);
}

var username = userNamePrefix + userNo
socket.emit('login', username);
});
})(io.connect('http://192.168.0.12:3000', { 'force new connection': true }));
}

关于javascript - Node.js 服务中的 socket.io 事件使用的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23457615/

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