前言
大部分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;  |