Fleck WebSockets
我想在我的WebSocket项目中使用Fleck,
服务器端看起来非常简单,但是如何区分打开的连接。 是否有某种ID? 我能想到的唯一方法是在OnOpen事件中创建GUID,并将其传递回客户端。 有没有更聪明的解决方案?
基本服务器设置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
现在,Fleck在WebSocketConnectionInfo上为每个连接的客户端创建一个Guid ID。在多个连接使用相同IP的情况下,这将有所帮助。在这里查看相关的提交:
https://github.com/statianzo/Fleck/commit/fc037f49362bb41a2bc753a5ff51cc9da40ad824
向用户询问用户名,并将用户名附加到套接字地址:
1 2 | var wsimpl = window.WebSocket || window.mozWebSocket; window.ws = new wsimpl('http://localhost:8080/myApp_' + userName, myProtocol); |
然后在使用socket.WebSocketConnectionInfo.path打开套接字后,在服务端删除用户名。还有一个clientip属性也可以使用。我正在这样做,效果很好。
我开始的事情与您在问我正在做的事情类似。就我而言,我正在使用
您可以从ConnectionInfo中获得很多信息
因此,要回答您的问题以将其发送给除发送方以外的所有人,您可以根据ConnectionInfo区分每个套接字(如果适用,也可以从此信息中创建UID)
作为一个非常基本的示例:
如果您知道每个客户端都有不同的IP,则可以执行以下操作:
1 2 3 4 5 6 7 | socket.OnMessage = message => { foreach (IWebSocketConnection socketConnection in allSockets.Where(socketConnection => socket.ConnectionInfo.ClientIpAddress != socketConnection.ConnectionInfo.ClientIpAddress)) { socketConnection.Send("Echo:" + message); } }; |
每个客户端有一个不同的套接字实例,因此我认为您应该能够做到:
1 | allSockets.Where(x => x != socket).ToList().ForEach(s => s.Send("Echo:" + message)); |