2012-02-05 4 views
4

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

Основной сервер создан:

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

ответ

6

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

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

2

Попросите пользователя для имени пользователя и прикрепить имя к гнездовой адресу:

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

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

+0

Спасибо за ответ, но я уже модифицировали WebSocket иметь идентификатор GUID. –

1

Я начал что-то подобное тому, что вы просите, я делаю. В моем случае я использую 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); 
    } 
}; 
+2

ConnectionInfo теперь имеет идентификатор Guid. Это должно помочь в случаях, когда несколько клиентов имеют один и тот же IP-адрес. https://github.com/statianzo/Fleck/commit/fc037f49362bb41a2bc753a5ff51cc9da40ad824 – statenjason

+0

@statenjason Возможно, следует добавить это как ответ, чтобы люди больше осознавали, что теперь он является частью Fleck, а не OP, реализующий свою собственную версию. – Sphvn

+0

Добавлен ответ. – statenjason

0

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

allSockets.Where(x => x != socket).ToList().ForEach(s => s.Send("Echo: " + message));