关于c#:Fleck WebSockets

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.Path来区别我的套接字在做什么。

您可以从ConnectionInfo中获得很多信息

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

因此,要回答您的问题以将其发送给除发送方以外的所有人,您可以根据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));