socket.io 中的“socket”对象实际上是什么?如何确保其使用最佳?

Sru*_*rai 2 websocket node.js socket.io

我目前有一个项目,我必须在其中使用nodejs和开发基于网络的棋盘游戏socket.io。问题是,我直接从 Android 开发跳到了 Web 开发,所以我在理解概念方面遇到了一些问题。

我已经实现了一些代码,其中客户端连接到服务器 ( app.js)、发送消息、接收消息等。我还添加了一个小聊天窗口供玩家聊天。它的工作。我对发送消息和加入房间的东西有了粗略的想法。

问题是,我不确定如何充分利用socket用户连接时服务器收到的对象。我应该将该对象保存socket某处以备将来使用吗?或者我只是将用户添加到房间,因此可以向单个用户发送消息并且不关心将套接字保存到变量?socket在这个项目的未来开发中,我需要再次使用该对象来做某些事情的机会有多大?我确实在控制台中输出了套接字对象以查看它包含哪些信息,但是,这对我来说太难理解了。

jfr*_*d00 5

在 socket.io 中,socket 对象是一个 Javascript 对象,socket.io 使用它来跟踪给定套接字的状态。它有一些方法和属性,对您用于某些目的很有用,为了使用它们,您必须获得对所需套接字对象的引用。

但是,您不一定需要自己保存套接字对象,因为 socket.io 服务器基础结构保存了所有这些对象并将它们保存在一个有组织的结构中,如果您想或需要,您可以在将来随时找到它们。

将套接字引用保留在闭包中也是很常见的,它允许您接收消息并响应发送该消息的套接字,就像在这种类型的方案中一样:

io.on('connection', function(socket){
    socket.on('getDataX', function(requestArgs) {
        // process the getDataX request

        // send response to that same socket
        socket.emit('replyDataX', ....);
    });
});
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过以下方式向所有套接字广播:

io.emit('update', ...);
Run Code Online (Sandbox Code Playgroud)

您可以通过多种方式访问​​ socket.io 存储的已连接套接字列表。例如:

io.sockets.connected
Run Code Online (Sandbox Code Playgroud)

是一个对象,其中的属性是套接字 id 和套接字对象的值,因此可以在给定 id 时找到一个套接字对象,或者可以迭代所有连接的套接字。

您还可以将自己的属性添加到套接字对象。一些聊天系统会向套接字对象添加用户名,因此您还可以通过他们的用户名识别或查找给定的用途。

  • 在浏览器中刷新页面将释放与该页面关联的所有资源,包括任何连接的 webSocket。通常,新加载的页面只会建立一个新的连接并从那里继续。如果您希望服务器能够识别新刷新的页面是刚才连接的同一用户,这通常是通过某种用户识别 cookie 完成的。由于 webSocket/socket.io 连接以 http 请求开始,所有 cookie 也存在于那里,socket.io 允许您访问通过初始连接发送的 cookie。 (2认同)
  • 因此,您可以使用用户标识 cookie 或会话(您必须首先将其放在那里)来维护用户的身份,即使他们关闭了他们的套接字,然后在浏览站点或刷新页面时重新打开一个新的套接字。 (2认同)