Javascript Node.JS Socket.IO应用程序客户端标识问题。所有客户端都显示为与上次连接的客户端具有相同的id
我试图建立一个简单的系统,在这个系统中,我会给客户添加一些细节,比如昵称、国家等,但我偶然发现了一个关于信息注册不正确的问题 请看一下我的代码: index.js /inc/chat.js 好的,如果我启动这个简单的节点服务器,在三个不同的浏览器选项卡中打开页面而不发送任何消息,那么id似乎是正确的 但一旦我从其中一个浏览器选项卡发送消息,它就会采用最后连接的客户端id 服务器启动时,会在控制台中输出以下内容:Javascript Node.JS Socket.IO应用程序客户端标识问题。所有客户端都显示为与上次连接的客户端具有相同的id,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我试图建立一个简单的系统,在这个系统中,我会给客户添加一些细节,比如昵称、国家等,但我偶然发现了一个关于信息注册不正确的问题 请看一下我的代码: index.js /inc/chat.js 好的,如果我启动这个简单的节点服务器,在三个不同的浏览器选项卡中打开页面而不发送任何消息,那么id似乎是正确的 但一旦我从其中一个浏览器选项卡发送消息,它就会采用最后连接的客户端id 服务器启动时,会在控制台中输出以下内容: [nodemon] starting `node index.js` /#h9s
[nodemon] starting `node index.js`
/#h9sraEo5c8uLKgczAAAA added to clients.
/#opAfZCrRa64gFsR7AAAB added to clients.
/#x-WfhClfNsLEWE85AAAC added to clients.
如果刷新第一个选项卡:
removing client:
/#x-WfhClfNsLEWE85AAAC
client list after removal:
/#x-WfhClfNsLEWE85AAAC
/#x-WfhClfNsLEWE85AAAC
/#pdlKD-v3K15_2voZAAAD added to clients.
如果我从该选项卡发送消息:
Message recieved from /#pdlKD-v3K15_2voZAAAD
如果现在切换到另一个选项卡并编写消息,服务器将输出与上面相同的消息,并更改浏览器中id的视觉表示形式
为什么连接的客户端的id会更改为上次连接的客户端的id?I您的套接字。在index.js中的('message')
事件上,您会从回调中获得msg
,但您使用的是具有当前客户端的client
。
改为使用msg
变量,如:
socket.on('message', function (msg) {
//msg holds the client
console.log('Message recieved from ' + msg.clientId);
socket.emit('client info', client);
});
并从客户端发送clientId,如:
var id = socket.socket.sessionid;
socket.emit('message', {message: $(this).val(), clientId: id);
注意:此sessionid与服务器clientid不同。问题在于,从chat.js的
第4行开始的客户端对象被重用,而没有重置detalis,从而导致数据不唯一
删除对象并从第16行开始动态生成后,chat.js解决了所有已知的关于所有id都是最后一个id的问题
以下是更新的脚本:
index.js
chat.js
module.exports={
/*客户端阵列初始化*/
客户:[],
init:函数(卫星化、套接字、回调){
var init=this;
if(回调类型==“函数”){
变量客户端={
id:null,
用户名:null,
geo:null
}
client.id=socket.id;
satelize.satelize({ip:this.ip(socket)},函数(错误,有效负载){
client.geo=有效载荷;
var=null;
如果(init.clients.length>0){
对于(var i=0;i0){
log('删除后的客户端列表:');
对于(var i=0;i
该参数保存从客户端发送的实际消息,该消息可以是任何内容,在本例中是来自输入元素的字符串。我不希望从客户端传递服务器使用和id,因为这样可以操纵系统。因此,通过使用实际的套接字,我可以通过其id在阵列服务器端查找客户机详细信息。至少这是我的计划,但显然有些地方不对劲。谢谢你看,但是这是错的,对不起。它自身拥有的msg
消息clientid
属性。再次检查答案。我必须检查以确保msg变量只保存#input
中的值。请参阅:socket.emit('message',$(this.val())
如果i console.log是msg变量服务器端,它只保存表示#input
元素值的字符串。
Message recieved from /#pdlKD-v3K15_2voZAAAD
socket.on('message', function (msg) {
//msg holds the client
console.log('Message recieved from ' + msg.clientId);
socket.emit('client info', client);
});
var id = socket.socket.sessionid;
socket.emit('message', {message: $(this).val(), clientId: id);
var express = require('express'),
app = express(),
server = require('http').Server(app),
io = require('socket.io')(server),
glob = require('glob'),
path = require('path'),
fs = require('fs'),
satelize = require('satelize');
var chat = require(__dirname + '/inc/chat');
server.listen(8888);
app.use('/public', express.static(path.join(__dirname, 'public')));
app.get('/', function (req, res) {
res.sendFile(__dirname + '/views/index.html');
});
io.on('connection', function (socket) {
socket.id = chat.uniqueId();
chat.init(satelize,socket, function () {
var client = chat.fetchClient(socket.id);
socket.emit('client info', client);
socket.on('message', function (msg) {
console.log(client.id + ' sent: ' + msg);
socket.emit('client info', client);
});
socket.on('disconnect', function () {
chat.removeClient(client);
});
});
});
module.exports = {
/* client array initialization */
clients: [],
init: function (satelize, socket, callback) {
var init = this;
if (typeof callback == "function") {
var client = {
id : null,
username: null,
geo : null
}
client.id = socket.id;
satelize.satelize( { ip : this.ip(socket ) }, function(error, payload) {
client.geo = payload;
var exists = null;
if (init.clients.length > 0) {
for (var i = 0; i < init.clients.length; i++) {
if(init.clients[i].id == client.id) {
exists = client.id;
}
}
}
if (exists == null) {
init.addClient(client);
}
callback();
});
}
},
/* information retrieval*/
ip: function (socket) {
return cleanIp(socket.handshake.address)
},
/* client (the user) stuff */
addClient: function (client) {
if (client.id !== null) {
this.clients.push(client);
console.log(client.id + ' added to clients.');
} else {
console.log('Cannot add client: id (null)');
}
},
fetchClient: function (id) {
for (var i = 0; i < this.clients.length; i++) {
if(this.clients[i].id == id) {
return this.clients[i];
}
}
},
removeClient: function (client) {
console.log('removing client: ' + client.id);
var found = null;
for (var i = 0; i < this.clients.length; i++) {
if (this.clients[i] == client) {
this.clients.splice(i,1);
found = this.clients[i];
break;
}
}
if (this.clients.length > 0) {
console.log('client list after removal: ');
for (var i = 0; i < this.clients.length; i++) {
console.log(this.clients[i].id);
}
} else {
console.log('No clients in client array after last removal.');
}
},
uniqueId : function() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + s4();
}
}
function cleanIp (ip) {
return ip.replace('::ffff:','');
}