斑点 WebSockets
Posted
技术标签:
【中文标题】斑点 WebSockets【英文标题】:Fleck WebSockets 【发布时间】:2012-02-05 14:48:44 【问题描述】:我想在我的 WebSocket 项目中使用 Fleck, 服务器端看起来很简单,但是如何区分打开的连接。有某种身份证明吗?我能想到的唯一方法是在 OnOpen 事件中创建 GUID 并将其传递回客户端。有更智能的解决方案吗?
基本服务器设置:
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
【问题讨论】:
【参考方案1】:Fleck 现在在 WebSocketConnectionInfo 上为每个连接的客户端创建一个 Guid Id。这将在多个连接使用相同 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 属性也可以使用。我正在这样做,效果很好。
【讨论】:
感谢您的回答,但我已经将 WebSocket 修改为具有 GUID。【参考方案3】:我开始了一些类似于你问我正在做的事情。在我的情况下,我使用 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);
;
【讨论】:
ConnectionInfo 现在有一个 Guid Id。它应该在多个客户端共享相同 IP 的情况下有所帮助。 github.com/statianzo/Fleck/commit/… @statenjason 可能应该将其添加为答案,以便人们更加意识到它现在是 Fleck 的一部分,而不是 OP 实现他自己的版本。【参考方案4】:每个客户端都有不同的套接字实例,所以我认为你应该能够做到:
allSockets.Where(x => x != socket).ToList().ForEach(s => s.Send("Echo: " + message));
【讨论】:
以上是关于斑点 WebSockets的主要内容,如果未能解决你的问题,请参考以下文章