博客
关于我
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/

你可能感兴趣的文章
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>
NIH发布包含10600张CT图像数据库 为AI算法测试铺路
查看>>
NIO ByteBuffer实现原理
查看>>
Nio ByteBuffer组件读写指针切换原理与常用方法
查看>>
NIO Selector实现原理
查看>>
nio 中channel和buffer的基本使用
查看>>
NIO基于UDP协议的网络编程
查看>>
NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
查看>>
Nitrux 3.8 发布!性能全面提升,带来非凡体验
查看>>
NI笔试——大数加法
查看>>