我想在我的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
https://github.com/statianzo/Fleck/commit/fc037f49362bb41a2bc753a5ff51cc9da40ad824
询问用户的用户名,并将用户名附加到套接字地址:
var wsimpl = window.WebSocket || window.mozWebSocket;
window.ws = new wsimpl('http://localhost:8080/myApp_' + userName, myProtocol);
然后在使用socket打开套接字之后,去掉服务端的userName。WebSocketConnectionInfo.path。还有一个clientip属性也可以使用。我正在做这件事,效果很好。
我开始做一些类似于您要求我做的事情。在我的情况下,我使用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);
}
};
每个客户端都有不同的套接字实例,所以我认为您应该能够做到:
allSockets.Where(x => x != socket).ToList().ForEach(s => s.Send("Echo: " + message));