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

本文共 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 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访问控制_登陆权限的控制(http_auth_basic_module)
查看>>
nginx负载均衡和反相代理的配置
查看>>
nginx负载均衡器处理session共享的几种方法(转)
查看>>
nginx负载均衡的5种策略(转载)
查看>>
nginx负载均衡的五种算法
查看>>
nginx转发端口时与导致websocket不生效
查看>>
Nginx运维与实战(二)-Https配置
查看>>
Nginx配置Https证书
查看>>
Nginx配置ssl实现https
查看>>
Nginx配置TCP代理指南
查看>>
Nginx配置——不记录指定文件类型日志
查看>>
nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
查看>>
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
nginx配置全解
查看>>
Nginx配置参数中文说明
查看>>
nginx配置域名和ip同时访问、开放多端口
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>