| | |
| | | using ServiceStack.Configuration; |
| | | using ServiceStack; |
| | | using Spectre.Console; |
| | | using System.Net.WebSockets; |
| | | using System.Net; |
| | | using System.Threading; |
| | | |
| | | namespace GZ.Projects.AuxAllWCS |
| | | { |
| | |
| | | } |
| | | |
| | | // æ§è¡å§æ |
| | | if (methodName != "TaskEverythingRun") |
| | | return null; |
| | | return methodDelegate.DynamicInvoke(args); |
| | | } |
| | | |
| | |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"Threadwxr2Rãã -åéæ«ç "); |
| | | LogHelper.Info($"Threadwxr2Rãã -åéæ«ç "); |
| | | TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin("544F4E")); |
| | | } |
| | | } |
| | |
| | | return new HkReturnResult { reqCode = model.reqCode, code = 0 }; |
| | | } |
| | | |
| | | public void TaskEverythingRun() |
| | | { |
| | | var host = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()); |
| | | foreach (var ip in host.AddressList) |
| | | { |
| | | if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) |
| | | { |
| | | Console.WriteLine($"ip= {ip.ToString()}"); |
| | | |
| | | new TcpServer(ip.ToString()); |
| | | var server = new EnhancedWebSocketServer($"http://{ip.ToString()}:8809/").StartAsync(); |
| | | //var client = new WebSocketClient($"http://{ip.ToString()}:8809/").ConnectAsync(); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | class EnhancedWebSocketServer |
| | | { |
| | | private HttpListener _listener; |
| | | private readonly string _listenerPrefix; |
| | | private readonly ConcurrentDictionary<Guid, WebSocket> _connections = new ConcurrentDictionary<Guid, WebSocket>(); |
| | | private CancellationTokenSource _cts = new CancellationTokenSource(); |
| | | |
| | | public EnhancedWebSocketServer(string url) |
| | | { |
| | | _listenerPrefix = url; |
| | | } |
| | | |
| | | public async Task StartAsync() |
| | | { |
| | | try |
| | | { |
| | | _listener = new HttpListener(); |
| | | _listener.Prefixes.Add(_listenerPrefix); |
| | | _listener.Start(); |
| | | Console.WriteLine($"WebSocketæå¡å¨å·²å¯å¨ï¼çå¬ {_listenerPrefix}"); |
| | | while (!_cts.IsCancellationRequested) |
| | | { |
| | | HttpListenerContext context = await _listener.GetContextAsync(); |
| | | if (context.Request.IsWebSocketRequest) |
| | | { |
| | | var wsContext = await context.AcceptWebSocketAsync(null); |
| | | var connectionId = Guid.NewGuid(); |
| | | _connections[connectionId] = wsContext.WebSocket; |
| | | _ = HandleConnectionAsync(connectionId, wsContext.WebSocket, _cts.Token); |
| | | } |
| | | else |
| | | { |
| | | context.Response.StatusCode = 400; |
| | | context.Response.Close(); |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) when (ex is HttpListenerException || ex is ObjectDisposedException) |
| | | { |
| | | // æå¡å¨åæ¢æ¶çæ£å¸¸å¼å¸¸ |
| | | Console.WriteLine("æå¡å¨æ£å¨åæ¢..."); |
| | | } |
| | | } |
| | | |
| | | private async Task HandleConnectionAsync(Guid connectionId, WebSocket webSocket, CancellationToken ct) |
| | | { |
| | | var buffer = new byte[1024 * 4]; |
| | | try |
| | | { |
| | | while (webSocket.State == WebSocketState.Open && !ct.IsCancellationRequested) |
| | | { |
| | | var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), ct); |
| | | |
| | | if (result.MessageType == WebSocketMessageType.Close) |
| | | { |
| | | await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "客æ·ç«¯å
³éè¿æ¥", ct); |
| | | break; |
| | | } |
| | | |
| | | string message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count); |
| | | Console.WriteLine($"è¿æ¥ {connectionId} æ¶å°æ¶æ¯: {message}"); |
| | | |
| | | // å¹¿ææ¶æ¯ç»ææå®¢æ·ç«¯ |
| | | await BroadcastMessageAsync($"客æ·ç«¯ {connectionId} 说: {message}"); |
| | | } |
| | | } |
| | | catch (WebSocketException ex) |
| | | { |
| | | Console.WriteLine($"è¿æ¥ {connectionId} é误: {ex.WebSocketErrorCode} - {ex.Message}"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"å¤çè¿æ¥ {connectionId} æ¶åºé: {ex.Message}"); |
| | | } |
| | | finally |
| | | { |
| | | _connections.TryRemove(connectionId, out _); |
| | | webSocket?.Dispose(); |
| | | Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} è¿æ¥ {connectionId} å·²å
³é"); |
| | | } |
| | | } |
| | | |
| | | public async Task BroadcastMessageAsync(string message) |
| | | { |
| | | var buffer = System.Text.Encoding.UTF8.GetBytes(message); |
| | | foreach (var connection in _connections) |
| | | { |
| | | if (connection.Value.State == WebSocketState.Open) |
| | | { |
| | | try |
| | | { |
| | | await connection.Value.SendAsync( |
| | | new ArraySegment<byte>(buffer), |
| | | WebSocketMessageType.Text, |
| | | true, |
| | | CancellationToken.None); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"å¹¿ææ¶æ¯å°è¿æ¥ {connection.Key} 失败: {ex.Message}"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | public async Task StopAsync() |
| | | { |
| | | _cts.Cancel(); |
| | | |
| | | // å
³éææè¿æ¥ |
| | | foreach (var connection in _connections) |
| | | { |
| | | try |
| | | { |
| | | if (connection.Value.State == WebSocketState.Open) |
| | | { |
| | | await connection.Value.CloseAsync( |
| | | WebSocketCloseStatus.NormalClosure, |
| | | "æå¡å¨å
³é", |
| | | CancellationToken.None); |
| | | } |
| | | connection.Value.Dispose(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"å
³éè¿æ¥ {connection.Key} æ¶åºé: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | _listener?.Stop(); |
| | | _listener?.Close(); |
| | | Console.WriteLine("WebSocketæå¡å¨å·²åæ¢"); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | internal class WebSocketClient |
| | | { |
| | | private ClientWebSocket _webSocket = new ClientWebSocket(); |
| | | private readonly Uri _serverUri; |
| | | |
| | | public WebSocketClient(string serverUrl) |
| | | { |
| | | _serverUri = new Uri(serverUrl); |
| | | } |
| | | |
| | | public async Task ConnectAsync() |
| | | { |
| | | try |
| | | { |
| | | await _webSocket.ConnectAsync(_serverUri, CancellationToken.None); |
| | | Console.WriteLine("å·²è¿æ¥å°WebSocketæå¡å¨"); |
| | | |
| | | // å¯å¨æ¥æ¶æ¶æ¯ä»»å¡ |
| | | _ = ReceiveMessagesAsync(); |
| | | |
| | | // åéæµè¯æ¶æ¯ |
| | | await SendMessageAsync("Hello, Server!"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"è¿æ¥å¤±è´¥: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | private async Task ReceiveMessagesAsync() |
| | | { |
| | | var buffer = new byte[1024]; |
| | | try |
| | | { |
| | | while (_webSocket.State == WebSocketState.Open) |
| | | { |
| | | var result = await _webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); |
| | | if (result.MessageType == WebSocketMessageType.Close) |
| | | { |
| | | await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None); |
| | | Console.WriteLine("æå¡å¨å
³éäºè¿æ¥"); |
| | | break; |
| | | } |
| | | |
| | | string message = Encoding.UTF8.GetString(buffer, 0, result.Count); |
| | | Console.WriteLine($"æ¶å°æå¡å¨æ¶æ¯: {message}"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"æ¥æ¶æ¶æ¯æ¶åºé: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | public async Task SendMessageAsync(string message) |
| | | { |
| | | if (_webSocket.State != WebSocketState.Open) |
| | | { |
| | | Console.WriteLine("WebSocketæªè¿æ¥ï¼æ æ³åéæ¶æ¯"); |
| | | return; |
| | | } |
| | | |
| | | byte[] buffer = Encoding.UTF8.GetBytes(message); |
| | | await _webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None); |
| | | } |
| | | |
| | | public async Task DisconnectAsync() |
| | | { |
| | | if (_webSocket.State == WebSocketState.Open) |
| | | { |
| | | await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "客æ·ç«¯å
³éè¿æ¥", CancellationToken.None); |
| | | } |
| | | _webSocket.Dispose(); |
| | | Console.WriteLine("å·²æå¼WebSocketè¿æ¥"); |
| | | } |
| | | } |
| | | |
| | | |
| | | class Messss |
| | | { |
| | | public bool success { get; set; } |