Godfather
Godfather

Reputation: 372

Change Socket for another user

I'm trying to develop an API for multiplayer online using socket programming in node js I have some basic questions: 1. How to know which connection is related to a user? 2. How to create a socket object related to another person? 3. When it's opponent turn, how to make an event? 4. There is a limited time for move, how to handle the time to create an event and change turn?

As it is obvious I don't know how to handle users and for example list online users

If you can suggest some articles or answering these questions would be greate

Thanks

Upvotes: 0

Views: 149

Answers (1)

Alex
Alex

Reputation: 281

  1. Keep some sort of data structure in memory where you are saving your sockets to. You may want to wrap the node.js socket in your own object which contains an id property. Then you can save these objects into a data structure saved in memory.

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

Then save this object in memory when you get a new socket.

const sockets = {}

server = net.createServer((socket) => {
    const user = new User(socket);
    sockets[user.id] = user
})
  1. I am unsure what you mean by that, but maybe the above point helps out
  2. This depends on when you define a new turn starts. Does the new turn start by something that is triggered by another user? If so use your solution to point 2 to relay that message to the related user and write something back to that socket.
  3. Use a timeout. Maybe give your User class an additional property timeout whenver you want to start a new timeout do timeout = setTimeout(timeouthandler,howlong) If the timeouthandler is triggered the user is out of time, so write to the socket. Don't forget to cancel your timeouts if you need to.

Also, as a side note, if you are doing this with pure node.js tcp sockets you need to come up with some ad-hoc protocol. Here is why:

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

You could do something like

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?
       })
    }

}

EDIT: This is not something that scales well. This is just to give you an idea on what can be done. Imagine for some reason you decide to have one node.js server instance running for hundreds of users. All those users socket instances would be stored in the servers memory

Upvotes: 1

Related Questions