前言
大部分Socket相关的库都要求.Net Framework 4
及以上,
为了支持3.5
试了好多的库。
现在还是切换到了4.0的环境,支持3.5的库没有找到合适没问题的。
NuGet安装包重新安装
如果我们升级版本或者降低版本,引入的库也要相应的升级和降级,最简单的方式是重新安装所有的库
方式如下:
工具
=>NuGet包管理器
=>程序包管理器控制台
输入
1 | Update-Package -reinstall |
SuperWebSocket(服务端)(.Net Framework)
推荐使用
SuperWebSocket :https://github.com/kerryjiang/SuperWebSocket
服务端
运行环境
.Net Framework 4
安装
1 | install-package SuperWebSocket |
工具类
1 | namespace z_remote_control.Utils |
调用
1 | private void StartServer() |
JS发送心跳包
1 | //心跳包 |
注意
MaxConnectionNumber不要设置太高,会非常占用内存,导致程序内存不足,要根据实际情况设置,我之前设置的10000,开启服务就会多占用大概600-700M,当程序将近1G时,就会报内存不足。
发送消息的时候要用线程池,否则群发信息的时候如果有用户网络中断,会导致给其它用户发消息也卡顿。
对比
ClearIdleSessionInterval和KeepAliveTime和KeepAliveInterval
KeepAliveTime 多长时间没有收到数据开始发送心跳包 单位秒
KeepAliveInterval 发送心跳包的时间间隔 单位秒
注意
如果想让断网的用户尽可能短的时间从服务端断开只需要调整
KeepAliveInterval
和KeepAliveTime
即可,不用修改ClearIdleSessionInterval
。但是
ClearIdleSessionInterval
的时间一定要大于客户端心跳包的时间间隔。
KeepAliveTime
可以小于心跳包的时间间隔,但是建议大于等于客户端心跳包的时间。
默认值
1 | public ServerConfig() |
常见问题
发送数据过长客户端断开连接
配置
1 | MaxRequestLength = 1024 * 1024 |
报错:
System.IO.FileNotFoundException:“未能加载文件或程序集“SuperSocket.SocketEngine”或它的某一个依赖项。系统找不到指定的文件。”
原因是DLL文件没有自动发布到目标目录中
我们就用命令复制
项目
->属性
->生成事件
->生成前事件命令行
添加如下
1 | xcopy /Y /d $(ProjectDir)\packages\SuperWebSocket.0.9.0.2\lib\net40\SuperSocket.SocketEngine.dll $(TargetDir) |
这样就大功告成了。
Fleck(服务端)
https://github.com/statianzo/Fleck
应该不错 Star比较多。
安装
1 | Install-Package Fleck -Version 1.2.0 |
WebSocketSharp(客户端/服务端)
https://github.com/sta/websocket-sharp
应该也不错
安装
1 | Install-Package WebSocketSharp -Version 1.0.3-rc11 |
SuperWebSocketNETServer(服务端)(.Net Framework)
该库也有问题,当客户端发送的数据过大(比如包含图片的Base64)时发送失败。
官网:https://archive.codeplex.com/?p=superwebsocket
服务端
运行环境
.Net Framework 4
项目右键
=>管理Nuget程序包
,搜索 SuperWebSocketNETServer
,点击右侧 安装
安装
1 | Install-Package SuperWebSocketNETServer -Version 0.8.0 |
使用
建立服务
1 | private WebSocketServer wsserver = null; |
关闭服务
1 | public void closeSocket() |
服务器状态
1 | public enum ServerState |
客户连接回调
1 | private static List<ZSocketsUser> socketsList = new List<ZSocketsUser>(); |
发送信息时要注意客户端的连接状态
1 | if(session.Connected){ |
其中ZSocketsUser
是我为了保存上线用户创建的类。
1 | public class ZSocketsUser |
辅助方法
1 | private ZSocketsUser getSocketUserById(string id) |
TouchSocket(服务端/客户端)(.Net6)
项目简介
https://gitee.com/dotnetchina/TouchSocket
支持
.NET 5.0
.NET Core 3.1
.NET Standard 2.0
.NET Framework 4.5
这个库优点
可以同时作为WS服务器和静态文件服务器。
安装
1 | Install-Package TouchSocket -Version 0.5.2 |
示例
1 | using System; |
其中
判断是否能发送
1 | client.CanSend |
发送
1 | ((HttpSocketClient)client).SendWithWS("hello"); |
WebSocket4Net(客户端)(.Net Framework)
安装
1 | install-package WebSocket4Net |
客户端类
1 | using SuperSocket.ClientEngine; |
websocketsharp.core(服务端/客户端)(.Net6)
不推荐
目前测试的时候Web端能正常,但是Android上不行。
SuperWebSocket
不支持.Net6,这个库支持。
官网:
https://github.com/ImoutoChan/websocket-sharp-core
https://github.com/sta/websocket-sharp
https://www.nuget.org/packages/websocketsharp.core/1.0.0?_src=template#supportedframeworks-body-tab
安装
1 | Install-Package websocketsharp.core -Version 1.0.0 |
代码
1 | using System.Collections.Generic; |
网页(客户端)
1 |
|
JS
1 | let timeunix = 0; |