显示与服务器断开连接的用户的用户名。

编程入门 行业动态 更新时间:2024-10-12 12:30:35

显示与服务器断开连接的用户的<a href=https://www.elefans.com/category/jswz/34/1770444.html style=用户名。"/>

显示与服务器断开连接的用户的用户名。

我试图在用户与服务器断开连接时显示一条消息。目前它的工作原理是将消息显示给所有连接的用户。然而,如果我尝试使用用户变量来显示哪个用户断开了连接,它就会显示连接的客户端名称,而不是实际离开的用户。我尝试了一些方法,但都没有成功,这是我想到的办法。在浏览器中,当有人断开连接时,以下代码会显示 "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>

希望能帮到你:)祝你编码愉快

更多推荐

显示与服务器断开连接的用户的用户名。

本文发布于:2024-05-13 13:04:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1759591.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:用户名   服务器   用户

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!