using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections.Concurrent; using System.Net; using HPSocket; using HPSocket.Tcp; using HPSocket.Ssl; using HPSocket.WebSocket; using HXX.Scanner.Common; namespace HXX.Scanner.Socket { class SocketServer { public static IWebSocketServer server; public static bool Start(string url) { try { var wss = false; //var url = (wss ? "wss" : "ws") + "://127.0.0.1:9999"; server = new WebSocketServer(url); // 忽略压缩扩展, 不忽略支持数据包压缩解压缩, 主流浏览器都支持 server.IgnoreCompressionExtensions = false; // 自动发送ping消息的时间间隔 // 毫秒,0不自动发送,默认不发送(多数分机房的防火墙都在1分钟甚至更短时间检测空连接,超时无交互则被踢,如果间隔过长,可能被机房防火墙误杀) // 目前浏览器都不支持在客户端发送ping消息,所以一般在服务器发送ping,在客户端响应接收到ping消息之后再对服务器发送pong,或客户端主动pong,服务器响应pong再发送ping给客户端 //server.PingInterval = 10000; // 最大封包大小 server.MaxPacketSize = 0x4000; // 子协议, 微信接口等会发送自定义的子协议,询问服务器是不是支持, 如果需要配置请再此配置 server.SubProtocols = null; if (wss) { // wss请开启此设置, 设置ssl配置, 会自动初始化ssl环境 //server.SslConfiguration = new SslConfiguration //{ // // 不从内存加载证书 // FromMemory = false, // // ssl证书配置, 支持单向验证 // VerifyMode = SslVerifyMode.Peer, // CaPemCertFileOrPath = "ssl-cert\\ca.crt", // PemCertFile = "ssl-cert\\server.cer", // PemKeyFile = "ssl-cert\\server.key", // KeyPassword = "123456", //}; try { server.SslConfiguration = new SslConfiguration { // 不从内存加载证书 FromMemory = false, // ssl证书配置, 支持单向验证 VerifyMode = SslVerifyMode.Peer, CaPemCertFileOrPath = "ssl-cert\\ca.crt", PemCertFile = "ssl\\client.cer", PemKeyFile = "ssl-cert\\server.key", KeyPassword = "123456", }; }catch(Exception ee) { } } if (!server.Start()) { server = null; LogManager.WriteLog("服务开启失败"); return false; } else { // 注册ws服务器, 未对path注册服务则无法访问 // 要注册的服务必须继承自HPSocket.WebSocket.IHub接口 // 注册欢迎服务, 客户端通过ws[s]://127.0.0.1:8800连接 server.AddHub("/"); // 注册回显服务, 客户端通过ws[s]://127.0.0.1:8800/echo连接 //server.AddHub("/echo"); LogManager.WriteLog("服务开启成功"); return true; } } catch (Exception ee) { server = null; LogManager.WriteLog(ee); return false; } } public static void Send(IntPtr connId, byte[] data) { server.Send(connId, OpCode.Text, data, data.Length); } public static void Send(IntPtr connId, string data) { server.Text(connId, data); } } }