Сокет чат на go

Рейтинг: 2Ответов: 2Опубликовано: 21.03.2015

Добрый день.

Пытаюсь разобраться с сокетами на go.

Как идентифицировать конкретное подключение?

Например, один пользователь даёт серверу такой запрос:

{action:message,from_id:111,to_id:222,message:'Привет. Как дела?'}

Сервер должен ответить {status:true} и перебрать всех подключенных пользователей, найти там пользователя id 222 и отправить конкретно ему данное сообщение.

Использую пример отсюда. С пакетами отсюда. Но здесь общий чат. Надо как-то фильтровать, от кого и кому пересылать данные. Как это делать?

Спасибо.

Ответы

▲ 3

Храните подключения клиентов в map-е, где в качестве ключа ID пользователя, что-то вроде такого:

var connections = make(map[int]*websocket.Connection, 0)

Ну и передавайте сообщения соответственно, как-то так:

if connections[userId] != nil {
    connections[userId].Send()
}

P.S. Конкретно пакет github.com/gorilla/websocket я не юзал, как там что устроено, не в курсе, я использую code.google.com/p/go.net/websocket, так что код исключительно, чтобы обрисовать мысль попонятней. :)

▲ 2

Я в Го небольшой специалист, поэтому могу посоветовать концептуально:

  1. Сделать общее хранилище сообщений - 'от','кому','текст','новое/прочитано' - и пусть каждый клиент в него лазит с некой переодичностью и забирает все 'новое'.

  2. Рассмотреть вариант с 'именованными каналами' - при подключении нового чат-клиента для него создается именной канал, список каналов хранить в каком-нибудь хэше, где ключ - это ИД клиента. Все сообщения этому клиенту пересылать через соответствующий канал.

Как-то так.