用户名。"/>
显示与服务器断开连接的用户的用户名。
我试图在用户与服务器断开连接时显示一条消息。目前它的工作原理是将消息显示给所有连接的用户。然而,如果我尝试使用用户变量来显示哪个用户断开了连接,它就会显示连接的客户端名称,而不是实际离开的用户。我尝试了一些方法,但都没有成功,这是我想到的办法。在浏览器中,当有人断开连接时,以下代码会显示 "undefined has left the chat"。
我如何纠正这个问题,以显示实际的用户名称?
在script.js中。
var user = user;
if (!user) {
user = prompt('Please choose a username:');
if (!user) {
alert('Your name has been set to "Anonymous"');
} else {
alert('Your name has been set to "'+ user +'"');
}
}
socket.emit('user disconnected', {
user: user
});
socket.on('user disconnected', (data) => {
$('.chat').append(data.user + " has left the chat");
});
在server. js里
server(socket('disconnect', ctx => { console.log(ctx.data); ctx.io.emit('user disconnected', ctx.data); }));
另外,一旦用户断开连接,"传输关闭 "就会被发布到控制台,我不知道这是什么意思。
回答如下:你很接近了。我已经为你的例子写了下面的代码。实际上,它将会比这更不同,比如添加一个数据库或使用一些会话存储。
下面是server.js
const app = require('http').createServer(handler);
const io = require('socket.io')(app);
const fs = require('fs');
const userIdMap = {};
app.listen(3000);
function handler(req, res) {
fs.readFile(__dirname + '/test.html', function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading test.html');
}
res.writeHead(200);
res.end(data);
});
}
io.on('connection', (socket) => {
var handshakeData = socket.request;
const userName = handshakeData._query['user'];
console.log('userName', userName);
if (!userName || userName === 'null') {
console.log('Disconnecting...');
return socket.disconnect();
}
const onLeave = () => {
console.log('disconnecting', userIdMap[socket.id]);
socket.broadcast.emit(
'userDisconnect',
`${userIdMap[socket.id]} is disconnected`
);
delete userIdMap[socket.id];
};
userIdMap[socket.id] = handshakeData._query['user'];
console.log('userIdMap', userIdMap);
socket.emit('news', { hello: 'world' });
socket.on('disconnect', onLeave);
socket.on('close', onLeave);
});
在上面的代码中。
- 我维护了一个用户名和socket.id的映射,这个映射对每个连接都是唯一的。
- 用户名存储在一个地图中 -
userIdMap
. 请注意,我是如何从查询中读取userName的。 - 我使用的是
socket.broadcast.emit()
向所有客户端广播,以防有人离开(标签关闭或重新加载)。 - 我们的广播是在
userDisconnect
事件,以防有人离开。客户端必须添加一个监听器,这样才能得到通知。
下面是客户端的实现。
<script src="https://cdn.jsdelivr/npm/socket.io-client@2/dist/socket.io.js"></script>
<script>
var user = user;
if (!user) {
user = prompt('Please choose a username:');
if (!user) {
alert('Your name has been set to "Anonymous"');
} else {
alert('Your name has been set to "' + user + '"');
}
}
var socket = io('http://localhost:3000', { query: `user=${user}` });
socket.on('connect', (data) => {
var handshakeData = socket.request;
console.log('connect', data);
});
socket.on('news', function (data) {
console.log('news', data);
});
socket.on('userDisconnect', (data) => alert(data));
</script>
希望能帮到你:)祝你编码愉快
更多推荐
显示与服务器断开连接的用户的用户名。
发布评论