更改另一个用户的套接字

时间:2019-01-23 15:12:38

标签: node.js sockets websocket serversocket

我正在尝试使用Node JS中的套接字编程为多人在线开发API 我有一些基本问题: 1.如何知道哪个连接与用户相关? 2.如何创建与另一个人相关的套接字对象? 3.当对手转弯时,如何进行比赛? 4.移动时间有限,如何处理创建事件和更改转弯的时间?

很明显,我不知道如何处理用户,例如列出在线用户

如果您可以建议一些文章或回答这些问题,那就太好了

谢谢

1 个答案:

答案 0 :(得分:1)

  1. 在将套接字保存到的内存中保留某种数据结构。您可能需要将node.js套接字包装在您自己的包含id属性的对象中。然后,您可以将这些对象保存到保存在内存中的数据结构中。

    class User {
    
       constructor(socket) {
            this.socket = socket;
            this.id = //some random id or even counter?
        }
    
    }
    

然后在获得新的套接字时将该对象保存在内存中。

const sockets = {}

server = net.createServer((socket) => {
    const user = new User(socket);
    sockets[user.id] = user
})
  1. 我不确定您的意思是什么,但也许以上几点对您有帮助
  2. 这取决于您何时定义新的转弯起点。新的转弯是否由其他用户触发的东西开始?如果是这样,请使用您的解决方案指向2,以将该消息转发给相关用户,然后将一些内容写回该套接字。
  3. 使用超时。每当您要开始新的超时时,也许给User类一个附加属性timeout,请执行timeout = setTimeout(timeouthandler,howlong),如果触发了超时处理程序,则用户时间已到,请写套接字。如果需要,请不要忘记取消超时。

此外,请注意,如果使用纯node.js tcp套接字进行此操作,则需要提出一些临时协议。这是原因:

socket.on("data", (data) => {
    //this could be triggered multiple times for a single socket.write() due to the streaming nature of tcp
})

您可以做类似的事情

class User {

    constructor(socket) {
        this.socket = socket;
        this.id = //some random id or even counter?

        socket.on("data", (data) => {
             //on each message you get, find out the type of message
             //which could be anything you define. Is it a login? 
             //  End of turn?
             //  logout?
       })
    }

}

编辑:这不是一个很好的扩展。这只是为了让您对可以做什么有所了解。想象一下,由于某种原因,您决定要为数百个用户运行一个node.js服务器实例。所有这些用户套接字实例将存储在服务器内存中