C# 在WebSocket 服务端使用Fleck
Fleck
Fleck 是 C# 中的 WebSocket 服务器实现。Fleck 是Nugget项目的分支 ,不需要继承、容器或其他引用。
Fleck 不依赖于HttpListener或HTTP.sys意味着它可以在 Windows 7 和 Server 2008 主机上运行。WebSocket 备注 - Microsoft Docs
例子
以下是将回显给客户端的示例。
var server = new WebSocketServer("ws://0.0.0.0:8181");
server.Start(socket =>
{
socket.OnOpen = () => Console.WriteLine("Open!");
socket.OnClose = () => Console.WriteLine("Close!");
socket.OnMessage = message => socket.Send(message);
});
支持的 WebSocket 版本
Fleck 支持多种现代网络浏览器的 WebSocket 版本
- Hixie-Draft-76/Hybi-00(Safari 5、Chrome < 14、Firefox 4(启用时))
- Hybi-07(火狐 6)
- Hybi-10(Chrome 14-16、Firefox 7)
- Hybi-13(Chrome 17+、Firefox 11+、Safari 6+、Edge 13+(?))
安全 WebSockets (wss://)
启用安全连接需要两件事:使用 schemewss而不是ws,并将 Fleck 指向包含公钥和私钥的 x509 证书
var server = new WebSocketServer("wss://0.0.0.0:8431");
server.Certificate = new X509Certificate2("MyCert.pfx");
server.Start(socket =>
{
//...use as normal
});
制作证书时遇到问题?请参阅 @AdrianBathurst创建 x509 的指南
子协议协商
要启用子协议协商,请在属性上指定支持的协议WebSocketServer.SupportedSubProtocols。协商的子协议将在套接字的ConnectionInfo.NegotiatedSubProtocol.
如果在客户端请求(Sec-WebSocket-Protocol 标头)中找不到支持的子协议,连接将被关闭。
var server = new WebSocketServer("ws://0.0.0.0:8181");
server.SupportedSubProtocols = new []{ "superchat", "chat" };
server.Start(socket =>
{
//socket.ConnectionInfo.NegotiatedSubProtocol is populated
});
自定义日志记录
Fleck 可以登录到 Log4Net 或任何其他第三方日志系统。只需FleckLog.LogAction用所需的行为覆盖该属性。
ILog logger = LogManager.GetLogger(typeof(FleckLog));
FleckLog.LogAction = (level, message, ex) => {
switch(level) {
case LogLevel.Debug:
logger.Debug(message, ex);
break;
case LogLevel.Error:
logger.Error(message, ex);
break;
case LogLevel.Warn:
logger.Warn(message, ex);
break;
default:
logger.Info(message, ex);
break;
}
};
禁用 Nagle 算法
设置NoDelay为true_WebSocketConnection.ListenerSocket
var server = new WebSocketServer("ws://0.0.0.0:8181");
server.ListenerSocket.NoDelay = true;
server.Start(socket =>
{
//Child connections will not use Nagle's Algorithm
});
侦听错误后自动重启
设置RestartAfterListenError为true_WebSocketConnection
var server = new WebSocketServer("ws://0.0.0.0:8181");
server.RestartAfterListenError = true;
server.Start(socket =>
{
//...use as normal
});

浙公网安备 33010602011771号