c# superwebsocket服务端可以寄宿在控制台程序、窗体程序、Windows服务
c# websocket客户端可以是控制台程序、窗体程序、Windows服务、html、手机,能连上websocket的就行了
服务端可以开启wss安全链接
如果想做即时通讯,双工通讯,或者因为频繁发送http请求导致的web服务器承受不住,都可以转用websocket
websocket 有良好的交互体验,快速的数据传输
websocket 开发简单,部署方便,上手没难度
我这里展示了,把websocket服务端寄宿在Windows服务里,客户端则用控制台访问和用web访问,调试阶段,为了避免频繁停启Windows服务,所以我用控制台启动了服务端,生产环境就可以直接把exe执行文件注册成服务了
底部有源代码百度盘下载,Windows服务安装方法
1.服务端
把websocket服务端类,拷贝到项目里
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketEngine;
using SuperWebSocket;
using System;
using System.Threading;
using System.Threading.Tasks;
//install-package SuperWebSocket
//install-package nlog
//install-package nlog.config
namespace WebSocketService
{
public class WSocketServer:IDisposable
{
public static NLog.Logger _Logger = NLog.LogManager.GetCurrentClassLogger();
#region 向外传递数据事件
public event Action<WebSocketSession, string> MessageReceived;
public event Action<WebSocketSession> NewConnected;
public event Action<WebSocketSession> Closed;
#endregion
public WebSocketServer WebSocket;
Thread _thread;
bool _isRunning = true;
public WSocketServer()
{
}
#region WebSockertServer
/// <summary>
/// 开启服务端
/// </summary>
/// <param name="port"></param>
/// <param name="serverName"></param>
/// <param name="isUseCertificate"></param>
/// <param name="serverStoreName"></param>
/// <param name="serverSecurity"></param>
/// <param name="serverThumbprint"></param>
/// <returns></returns>
public bool Open(int port, string serverName, bool isUseCertificate = false, string serverStoreName = "", string serverSecurity = "", string serverThumbprint = "")
{
bool isSetuped = false;
try
{
this.WebSocket = new WebSocketServer();
var serverConfig = new ServerConfig
{
Name = serverName,
MaxConnectionNumber = 10000, //最大允许的客户端连接数目,默认为100。
Mode = SocketMode.Tcp,
Port = port, //服务器监听的端口。
ClearIdleSession = false, //true或者false, 是否清除空闲会话,默认为false。
ClearIdleSessionInterval = 120,//清除空闲会话的时间间隔,默认为120,单位为秒。
ListenBacklog = 10,
ReceiveBufferSize = 64 * 1024, //用于接收数据的缓冲区大小,默认为2048。
SendBufferSize = 64 * 1024, //用户发送数据的缓冲区大小,默认为2048。
KeepAliveInterval = 1, //keep alive消息发送时间间隔。单位为秒。
KeepAliveTime = 60, //keep alive失败重试的时间间隔。单位为秒。
SyncSend = false
};
SocketServerFactory socketServerFactory = null;
//开启wss 使用证书
if (isUseCertificate)
{
serverConfig.Security = serverSecurity;
serverConfig.Certificate = new SuperSocket.SocketBase.Config.CertificateConfig
{
StoreName = serverStoreName,
StoreLocation = System.Security.Cryptography.X509Certificates.StoreLocation.LocalMachine,
Thumbprint = serverThumbprint
};
socketServerFactory = new SocketServerFactory();
}
isSetuped = this.WebSocket.Setup(new RootConfig(),serverConfig, socketServerFactory);
if (isSetuped)
{
_Logger.Info("Setup Success...");
}
else
{
_Logger.Error("Failed to setup!");
}
this.WebSocket.NewSessionConnected += NewSessionConnected;
this.WebSocket.NewMessageReceived += NewMessageReceived;
this.WebSocket.SessionClosed += SessionClosed;
isSetuped = this.WebSocket.Start();
if (isSetuped)
{
_Logger.Info("Start Success...");
_Logger.Info("Server Listen at " + this.WebSocket.Listeners[0].EndPoint.Port.ToString());
this._isRunning = true;
this._thread = new Thread(new ThreadStart(ProcessMaintainance));
this._thread.Start();
}
else
{
_Logger.Error("Failed to start!");
}
}
catch (Exception ex)
{
_Logger.Error(ex.ToString());
}
return isSetuped;
}
/// <summary>
/// 消息触发事件
/// </summary>
/// <param name="session"></param>
/// <param name="value"></param>
void NewMessageReceived(WebSocketSession session, string value)
{
try
{
_Logger.Info("Receive:" + value.ToString() + " ClientIP:" + sessio