Fleck WebSockets

时间:2012-02-05 14:48:44

标签: c# .net websocket

我想将Fleck用于我的WebSocket项目, 服务器端看起来非常简单,但如何区分打开的连接。有某种身份证吗?我能想到的唯一方法是在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));
};

E.G。如何建立一个聊天室,以便所有连接都能收到除发送消息之外的消息。

Fleck服务器:https://github.com/statianzo/Fleck

4 个答案:

答案 0 :(得分:6)

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打开套接字后,在服务端删除userName。还有一个clientip属性也可以使用。我这样做,效果很好。

答案 2 :(得分: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);
     }
 };

答案 3 :(得分:0)

每个客户端都是一个不同的套接字实例,所以我认为你应该可以这样做:

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