Fleck WebSockets - PullRequest
       9

Fleck WebSockets

4 голосов
/ 05 февраля 2012

Я хочу использовать Fleck для моего проекта WebSocket, Серверная сторона выглядит довольно просто, но как различать открытые соединения. есть какой-то идентификатор? Единственный способ, о котором я могу думать, - это создать GUID в событии OnOpen и передать его клиенту. есть ли более разумное решение?

Базовая настройка сервера:

socket.OnOpen = () =>
{
    Console.WriteLine("Open!"); 
    allSockets.Add(socket);
};

socket.OnClose = () =>
{
    Console.WriteLine("Close!");
    allSockets.Remove(socket);
};

socket.OnMessage = message =>
{
    Console.WriteLine(message);
    allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
};

например. как бы сделать чат, чтобы все соединения получали сообщения, кроме одного отправляющего.

Сервер Fleck здесь: https://github.com/statianzo/Fleck

Ответы [ 4 ]

6 голосов
/ 29 мая 2012

Fleck теперь создает Guid Id в WebSocketConnectionInfo для каждого подключенного клиента. Это поможет в случаях, когда несколько соединений используют один и тот же IP. Смотрите соответствующий коммит здесь:

https://github.com/statianzo/Fleck/commit/fc037f49362bb41a2bc753a5ff51cc9da40ad824

2 голосов
/ 07 февраля 2012

Запросите у пользователя имя пользователя и прикрепите имя пользователя к адресу сокета:

var wsimpl = window.WebSocket || window.mozWebSocket;
window.ws = new wsimpl('http://localhost:8080/myApp_' + userName, myProtocol);

затем удалите userName на стороне службы после того, как сокет был открыт с помощью socket.WebSocketConnectionInfo.path. Существует также свойство clientip, которое также можно использовать. Я делаю это, и это прекрасно работает.

1 голос
/ 08 марта 2012

Я начал что-то похожее на то, что вы просите, я делаю. В моем случае я использую ConnectionInfo.Path, чтобы различать, что делают мои сокеты.

Вы можете получить много информации уже из ConnectionInfo

socket.ConnectionInfo.{Host|Path|Origin|SubProtocol|ClientIPAddress|Cookies}

Таким образом, чтобы ответить на ваш вопрос и передать его всем, кроме отправителя, вы можете различать каждый сокет на основе ConnectionInfo (если применимо, вы также можете создать UID из этой информации)


В качестве очень простого примера:

Если вы знаете, что у каждого Клиента будет свой IP-адрес, будет работать что-то вроде следующего:

 socket.OnMessage = message =>
 {
     foreach (IWebSocketConnection socketConnection in allSockets.Where(socketConnection => socket.ConnectionInfo.ClientIpAddress != socketConnection.ConnectionInfo.ClientIpAddress))
     {
         socketConnection.Send("Echo: " + message);
     }
 };
0 голосов
/ 16 марта 2012

Это отдельный экземпляр сокета для каждого клиента, поэтому я бы подумал, что вы сможете сделать:

allSockets.Where(x => x != socket).ToList().ForEach(s => s.Send("Echo: " + message));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...