本文共 5275 字,大约阅读时间需要 17 分钟。
HttpListener和WebSocket在C#中的应用场景:实现请求处理与连接管理
为了构建一个能够同时处理HTTP和WebSocket请求的C#应用程序,可以遵循以下步骤进行配置和实现。本文将详细说明如何配置HttpListener以监听WebSocket消息,并展示如何在客户端和服务器端之间进行通信。
步骤1:创建新的控制台项目
首先,创建一个新的控制台项目,即TestClientWebsocket。在项目的Program.cs文件中,添加必要的命名空间引用和使用语句:
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Net.WebSockets;using System.Text;using System.Threading;using System.Threading.Tasks;
步骤2:配置服务器端 WebSocket 列表器
在HttpAndWebsocket类中,实现服务器端对WebSocket连接的处理。必要的配置包括指定HTTP监听地址和端口,并设置WebSocket的响应处理逻辑。以下是核心代码:
public class HttpAndWebsocket{ public async void Start(string url) { string url1 = "http://+:80/"; int Port = 1234; HttpListener httpListener = new HttpListener(); httpListener.Prefixes.Add("http:// + :" + Port + "/ "); httpListener.Start(); while (true) { try { HttpListenerContext httpListenerContext = await httpListener.GetContextAsync(); try { if (httpListenerContext.Request.IsWebSocketRequest) { ProcessRequest(httpListenerContext); } } catch (Exception) { httpListenersContext.Response.StatusCode = 400; httpListenersContext.Response.Close(); } } catch (Exception) { throw; } } } private async void ProcessRequest(HttpListenerContext listenerContext) { try { HttpListenerWebSocket httpListenerWebSocket = await listenerContext.AcceptWebSocketAsync(null); } catch (Exception) { listenerContext.Response.StatusCode = 500; listenerContext.Response.Close(); return; } WebSocket webSocket = httpListenerWebSocket.WebSocket; try { while (webSocket.State == WebSocketState.Open) { byte[] returnBytes = new byte[10240]; WebSocketReceiveResult webSocketReceiveResult = await webSocket.ReceiveAsync(new ArraySegment (returnBytes), CancellationToken.None); string ReceivesData = Encoding.UTF8.GetString(returnBytes, 0, webSocketReceiveResult.Count); ReceivesData = $"我已经收到数据:{ReceivesData}"; returnBytes = Encoding.UTF8.GetBytes(ReceivesData); await webSocket.SendAsync(new ArraySegment (returnBytes), WebSocketMessageType.Text, true, CancellationToken.None); await Task.Delay(TimeSpan.FromSeconds(3)); } } catch (Exception) { throw; } finally { if (webSocket != null) { webSocket.Dispose(); } } }} 步骤3:配置客户端 WebSocket 连接
在Program.cs文件中,实现客户端连接到WebSocket服务器的逻辑。在主函数中,创建客户端WebSocket实例,并连接到指定的WebSocket地址。以下是关键代码:
public static string SocketUrl = "ws://127.0.0.1:1234/";// public static string SocketUrl = "ws://192.168.1.202:8081/ws?id=";static void Main(string[] args){ HttpAndWebsocket httpAndWebsocket = new HttpAndWebsocket(); httpAndWebsocket.Start(SocketUrl); for (int i = 0; i < 2; i++) { System.Threading.Tasks.Task.Factory.StartNew(BBB, i); } Console.WriteLine("Press ENTER to exit..."); Console.ReadLine();}public static async void BBB(object i){ string x = $"这是第{i}个。。。"; try { ClientWebSocket cln = new ClientWebSocket(); await cln.ConnectAsync(new Uri(SocketUrl + i.ToString()), new CancellationToken()); string returnvalue = await Login(cln, "1", "1", "1", "1"); Console.WriteLine($"{returnvalue}"); } catch (Exception ex) { throw ex; }} 步骤4:实现客户端的登录逻辑
通过设计一个异步的Login方法,实现客户端向服务器发送数据包,并接收并解析服务器的响应。以下是Login方法的实现:
public static async TaskLogin(ClientWebSocket cln, string name, string no, string level, string imagestring){ byte[] bytess = Encoding.Default.GetBytes($"login#{name}#{no}#{level}#{imagestring}"); await cln.SendAsync(new ArraySegment (bytess), WebSocketMessageType.Text, true, new CancellationToken()); string returnValue = await GetAsyncValue(cln); return returnValue;}public static async Task GetAsyncValue(ClientWebSocket clientWebSocket){ string returnValue = null; byte[] buffer = new byte[10240]; WebSocketReceiveResult result = null; while (clientWebSocket.State == WebSocketState.Open) { result = await clientWebSocket.ReceiveAsync(new ArraySegment (buffer), CancellationToken.None); if (result.MessageType == WebSocketMessageType.Text) { returnValue = Encoding.UTF8.GetString(buffer, 0, result.Count); Console.WriteLine(returnValue); } } return returnValue;}
通过以上步骤,可以简要实现一个能够同时处理HTTP和WebSocket请求的C#应用程序。服务器端通过HttpListener监听 WebSocket 连接,并根据连接状态进行相应的数据处理和响应。客户端通过创建WebSocket实例,连接到服务器,并利用接受和发送数据的异步方法实现实时通信。
在实际应用中,可以根据具体需求进行扩展,比如添加更复杂的数据协议、请求验证机制、重建连接处理逻辑等,以满足更丰富的功能需求。
转载地址:http://fmmiz.baihongyu.com/