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
});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)