Изменить сокет для другого пользователя - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь разработать API для многопользовательской онлайн-игры с использованием сокет-программирования на узле js. У меня есть несколько основных вопросов: 1. Как узнать, какое соединение связано с пользователем?2. Как создать объект сокета, связанный с другим человеком?3. Когда наступает очередь противника, как сделать событие?4. Существует ограниченное время для перемещения, как обрабатывать время для создания события и изменения хода?

Как очевидно, я не знаю, как обращаться с пользователями и, например, перечислять пользователей онлайн

Если вы можете предложить какие-то статьи или ответить на эти вопросы, было бы здорово

Спасибо

1 Ответ

0 голосов
/ 23 января 2019
  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) Если тайм-аут-обработчик срабатывает, у пользователя нет времени, поэтому пишите в сокет. Не забудьте отменить время ожидания, если вам нужно.

Кроме того, как примечание: если вы делаете это с чистыми сокетами tcp node.js, вам нужно придумать какой-то специальный протокол. Вот почему:

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 для сотен пользователей. Все эти экземпляры сокетов пользователей будут храниться в памяти сервера

...