using Newtonsoft.Json.Linq; using Serein.Library.Attributes; using Serein.Library.Network.WebSocketCommunication.Handle; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.WebSockets; using System.Reflection; using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Serein.Library.Network.WebSocketCommunication { /// /// WebSocket服务类 /// [AutoRegister] public class WebSocketServer { /// /// 消息处理 /// public WebSocketMsgHandleHelper MsgHandleHelper { get; } = new WebSocketMsgHandleHelper(); private HttpListener listener; /// /// 进行监听服务 /// /// /// public async Task StartAsync(string url) { listener = new HttpListener(); listener.Prefixes.Add(url); try { listener.Start(); } catch (Exception ex) { await Console.Out.WriteLineAsync(ex.Message); return; } while (true) { try { var context = await listener.GetContextAsync(); string clientPoint = context.Request.RemoteEndPoint?.ToString(); await Console.Out.WriteLineAsync($"新的连接加入:{clientPoint}"); if (context.Request.IsWebSocketRequest) { var webSocketContext = await context.AcceptWebSocketAsync(null); //新连接 _ = HandleWebSocketAsync(webSocketContext.WebSocket); // 处理消息 } } catch (Exception ex) { await Console.Out.WriteLineAsync(ex.Message); break; } } } /// /// 停止监听服务 /// public void Stop() { listener?.Stop(); } private async Task HandleWebSocketAsync(WebSocket webSocket) { Func SendAsync = async (text) => { await WebSocketServer.SendAsync(webSocket, text); }; var buffer = new byte[1024]; while (webSocket.State == WebSocketState.Open) { var result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); if (result.MessageType == WebSocketMessageType.Close) { SendAsync = null; await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None); } else { var message = Encoding.UTF8.GetString(buffer, 0, result.Count); _ = MsgHandleHelper.HandleMsgAsync(SendAsync, message); //foreach (var item in HandldHelpers) //{ // await item.HandleSocketMsg(webSocket, message); //} //Console.WriteLine($"Received: {message}"); //var echoMessage = Encoding.UTF8.GetBytes(message); //await webSocket.SendAsync(new ArraySegment(echoMessage, 0, echoMessage.Length), result.MessageType, result.EndOfMessage, CancellationToken.None); } } } /// /// 发送消息 /// /// /// /// public static async Task SendAsync(WebSocket webSocket, string message) { var buffer = Encoding.UTF8.GetBytes(message); await webSocket.SendAsync(new ArraySegment(buffer), WebSocketMessageType.Text, true, CancellationToken.None); } } }