博客
关于我
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 pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
查看>>
python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
查看>>
Python图像处理:从内存加载jpeg
查看>>
python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
查看>>
python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
查看>>
python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
查看>>
python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
查看>>
Python哪个版本最稳定好用2023.10.19
查看>>
Python和黑客技术的渊源
查看>>
Python和RF编写接口自动化
查看>>
python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
查看>>
python和java哪个更值得学——来自知乎高赞回答
查看>>
python和c混合编程 github_在pycharm中使用git版本管理以及同步github的方法
查看>>
python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
查看>>
Python命名中尾随下划线有什么好处?
查看>>
Python启动脚本
查看>>
Python听写汇总结果
查看>>
python吊打Excel?屁!那是你不会用!
查看>>
Python合并两张图片 | 先叠透明度再合并 (附Demo)
查看>>
python各进制的表述与转换
查看>>