SocketServer.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Collections.Concurrent;
  10. using System.Net;
  11. using HPSocket;
  12. using HPSocket.Tcp;
  13. using HPSocket.Ssl;
  14. using HPSocket.WebSocket;
  15. using HXX.Scanner.Common;
  16. namespace HXX.Scanner.Socket
  17. {
  18. class SocketServer
  19. {
  20. public static IWebSocketServer server;
  21. public static bool Start(string url)
  22. {
  23. try
  24. {
  25. var wss = false;
  26. //var url = (wss ? "wss" : "ws") + "://127.0.0.1:9999";
  27. server = new WebSocketServer(url);
  28. // 忽略压缩扩展, 不忽略支持数据包压缩解压缩, 主流浏览器都支持
  29. server.IgnoreCompressionExtensions = false;
  30. // 自动发送ping消息的时间间隔
  31. // 毫秒,0不自动发送,默认不发送(多数分机房的防火墙都在1分钟甚至更短时间检测空连接,超时无交互则被踢,如果间隔过长,可能被机房防火墙误杀)
  32. // 目前浏览器都不支持在客户端发送ping消息,所以一般在服务器发送ping,在客户端响应接收到ping消息之后再对服务器发送pong,或客户端主动pong,服务器响应pong再发送ping给客户端
  33. //server.PingInterval = 10000;
  34. // 最大封包大小
  35. server.MaxPacketSize = 0x4000;
  36. // 子协议, 微信接口等会发送自定义的子协议,询问服务器是不是支持, 如果需要配置请再此配置
  37. server.SubProtocols = null;
  38. if (wss)
  39. {
  40. // wss请开启此设置, 设置ssl配置, 会自动初始化ssl环境
  41. //server.SslConfiguration = new SslConfiguration
  42. //{
  43. // // 不从内存加载证书
  44. // FromMemory = false,
  45. // // ssl证书配置, 支持单向验证
  46. // VerifyMode = SslVerifyMode.Peer,
  47. // CaPemCertFileOrPath = "ssl-cert\\ca.crt",
  48. // PemCertFile = "ssl-cert\\server.cer",
  49. // PemKeyFile = "ssl-cert\\server.key",
  50. // KeyPassword = "123456",
  51. //};
  52. try
  53. {
  54. server.SslConfiguration = new SslConfiguration
  55. {
  56. // 不从内存加载证书
  57. FromMemory = false,
  58. // ssl证书配置, 支持单向验证
  59. VerifyMode = SslVerifyMode.Peer,
  60. CaPemCertFileOrPath = "ssl-cert\\ca.crt",
  61. PemCertFile = "ssl\\client.cer",
  62. PemKeyFile = "ssl-cert\\server.key",
  63. KeyPassword = "123456",
  64. };
  65. }catch(Exception ee)
  66. {
  67. }
  68. }
  69. if (!server.Start())
  70. {
  71. server = null;
  72. LogManager.WriteLog("服务开启失败");
  73. return false;
  74. }
  75. else
  76. {
  77. // 注册ws服务器, 未对path注册服务则无法访问
  78. // 要注册的服务必须继承自HPSocket.WebSocket.IHub接口
  79. // 注册欢迎服务, 客户端通过ws[s]://127.0.0.1:8800连接
  80. server.AddHub<biz_Hub>("/");
  81. // 注册回显服务, 客户端通过ws[s]://127.0.0.1:8800/echo连接
  82. //server.AddHub<EchoHub>("/echo");
  83. LogManager.WriteLog("服务开启成功");
  84. return true;
  85. }
  86. }
  87. catch (Exception ee)
  88. {
  89. server = null;
  90. LogManager.WriteLog(ee);
  91. return false;
  92. }
  93. }
  94. public static void Send(IntPtr connId, byte[] data)
  95. {
  96. server.Send(connId, OpCode.Text, data, data.Length);
  97. }
  98. public static void Send(IntPtr connId, string data)
  99. {
  100. server.Text(connId, data);
  101. }
  102. }
  103. }