博客
关于我
HttpLitener处理http请求和Websocket请求
阅读量:533 次
发布时间:2019-03-09

本文共 5148 字,大约阅读时间需要 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 Task
Login(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/

你可能感兴趣的文章
python中文件最重要的功能是什么-学 Python 都用来干嘛的?
查看>>
python中文版语言_高盛最新调查:Python超过汉语成为未来最重要技能,你准备学哪种编程语言?...
查看>>
Python中文问题SyntaxError
查看>>
Python中方括号和括号括起来的列表有什么区别?
查看>>
python中时间处理_Python中处理时间的几种方法小结
查看>>
Python中枚举串口(包括虚拟端口)的跨平台方法是什么?
查看>>
python中根号下a怎么写_python中根号怎么表示
查看>>
Python中正则表达式的巧妙使用
查看>>
Python中浮点数的二进制表示(位不是十六进制)
查看>>
Python中特殊函数和表达式 filter,map,reduce,lambda
查看>>
python中用socket检测端口_Python 用socket模块实现检测端口和检测web服务
查看>>
python中用于列表操作的plus和append有什么区别?
查看>>
python中用递归求和
查看>>
python中的@staticmethod
查看>>
python中的array函数作用_NumPy 数组使用大全
查看>>
python中的isinstance判断多个对象类型
查看>>
python中的keys、values、items
查看>>
Python中的lambda和apply结合使用
查看>>
python中的map函数
查看>>
Python中的numpy模块解析
查看>>