XiaoFeng.Net 网络库使用

网络库介绍

XiaoFeng.Net网络库包含了 SocketServer,SocketClient,WebSocketServer,WebSocketClient四个类库
SocketServer 网络服务端同时支持Socket客户端连接,WebSocket客户端,浏览器WebSocket连接
SocketCleint 网络客户端
WebSocketServer WebSocket服务端仅支持WebSocket客户端连接或浏览器WebSocket连接
WebSocketClient WebSocket客户端

SocketServer 服务端

WebSocketServer 除了实例化参数不一样其它属性和SocketServer是一样的,因为WebSocketServer就是继承了SocketServer

 var c = new SocketServer(8011);//SSL证书
c.Certificate = new X509Certificate2(@"E:\\d.pfx", "7092734", X509KeyStorageFlags.MachineKeySet);
c.SslProtocols= System.Security.Authentication.SslProtocols.Tls12;
//是否启动定时向客户端发送pong功能
c.IsPong = false;
c.PongTime = 30;
c.OnStart += (o, e) =>
{//项目启动后触发当前事件w("项目启动.");
};
c.OnAuthentication += (c, m, e) =>
{//认证事件//对应Authentication认证委托,认证失败后会触发当前事件
};
c.Authentication = c =>
{//认证方法//在这里判断客户端是否是我们合法的客户端请求连接 return false 表示拒绝连接请求 return true 表示接受连接请求return true;
};
c.OnStop += (c, e) =>
{//项目停止后触发的事件w("项目停止.");
};
//下边OnMessage,OnMessageByte两个事件在实际工作中根据自己的需求用其中一个事件即可
c.OnMessage += (c, m, e) =>
{//接收到消息后触发当前事件w($"接收到消息[{c.EndPoint}](text):{m}");//向当前客户端发送接收到的消息c.Send(m);
};
c.OnMessageByte += (c, m, e) =>
{//接收到消息后触发当前事件w($"接收到消息[{c.EndPoint}](bytes):{m.GetString()}");//向当前客户端发送接收到的消息c.Send(m);
};
c.OnError += (c, e) =>
{//服务端出错触发当前事件w("出错:" + e.Message);
};
c.OnNewConnection += (c, e) =>
{//有新的客户端连接请求触发当前事件w($"新连接[{c.EndPoint}]");
};
c.OnDisconnected += (c, e) =>
{//客户端断开连接后触发当前事件w($"断开连接[{c.EndPoint}]");
};
c.OnClientError += (c,ip, e) =>
{//处理客户端出错时触发当前事件w($"客户端出错[{c.EndPoint}]:{e.Message}");
};
//启动
c.Start();//其它方法及属性
//当前连接的客户端
var clients = c.Clients;//添加黑名单 添加进黑名单的IP 通过这个IP的客户端都拒绝连接服务端
c.AddBlack("192.138.1.2");
//移除黑名单
c.RemoveBlack("192.168.1.2");Console.WriteLine();

SocketClient 客户端

WebSocketClient也是继承于SocketClient 所以它的属性和SocketClient也是一样的。
下边直接上代码

var ws = new SocketClient("127.0.0.1", 8011);
//是否启动定时ping功能
ws.IsPing = false;
ws.PingTime = 30;ws.OnMessage += (c, m, e) =>
{w("接收到消息(text):" + m);
};
ws.OnMessageByte += (c, m, e) =>
{w("接收到消息(bytes):" + m.GetString());
};
ws.OnClientError += (c,ip, e) =>
{w("出错:" + e.Message);
};
ws.OnStart += async (c, e) =>
{w("已启动");//await ws.SendAsync("消息").ConfigureAwait(false);
};
ws.OnStop += (c, e) =>
{w("已停止");
};
ws.Start();
Console.ReadLine();

WebSocketClient还有一个单独的属性WebSocketRequestOptions 它是一个请示配置类看它的完整代码

/// <summary>
/// WebSocketClient请求配置
/// </summary>
public class WebSocketRequestOptions
{#region 构造器/// <summary>/// 无参构造器/// </summary>public WebSocketRequestOptions(){this.WebHeader = new WebHeaderCollection();this[HttpRequestHeader.Connection] = "Upgrade";this[HttpRequestHeader.Pragma] = "no-cache";this["Sec-WebSocket-Extensions"] = "permessage-deflate; client_max_window_bits";this["Sec-WebSocket-Version"] = "13";this[HttpRequestHeader.Upgrade] = "websocket";this[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36";this[HttpRequestHeader.AcceptEncoding] = (AcceptEncodingType.GZIP | AcceptEncodingType.DEFLATE | AcceptEncodingType.BR).ToLower();this[HttpRequestHeader.CacheControl] = "no-cache";this[HttpRequestHeader.AcceptLanguage] = "zh-CN,zh;q=0.9";}#endregion#region 属性/// <summary>/// 获取请求头值/// </summary>/// <param name="header">头key <see cref="HttpRequestHeader"/></param>/// <returns>请求头值</returns>public String this[HttpRequestHeader header]{get => this.Get(header);set => this.Set(header, value);}/// <summary>/// 获取请求头值/// </summary>/// <param name="header">头key <see cref="HttpResponseHeader"/></param>/// <returns>请求头值</returns>public String this[HttpResponseHeader header]{get => this.Get(header);set => this.Set(header, value);}/// <summary>/// 获取请求头值/// </summary>/// <param name="key">key</param>/// <returns>请求头值</returns>public String this[String key]{get => this.Get(key);set => this.Set(key, value);}/// <summary>/// 请求地址/// </summary>private Uri _Uri;/// <summary>/// 请求地址 <see cref="System.Uri"/>/// </summary>public Uri Uri{get => this._Uri; set{this._Uri = value;this[HttpRequestHeader.Host] = value.Host + ":" + value.Port;}}/// <summary>/// 请求类型 <see cref="XiaoFeng.Http.HttpMethod"/> 或 <see cref="System.Net.Http.HttpMethod"/>/// </summary>public HttpMethod Method { get; set; } = HttpMethod.Get;/// <summary>/// Http协议版本 1.0,1.1,2.0,3.0/// </summary>public HttpVersionX HttpVersion { get; set; } = HttpVersionX.Version11;/// <summary>/// Host 标头,指定要请求的资源的主机名和端口号。/// </summary>public String Host => this[HttpRequestHeader.Host];/// <summary>/// Connection 标头,指定特定连接所需的选项。指定客户端和服务器之间的连接类型,如 keep-alive、close 等。/// </summary>public String Connection => this[HttpRequestHeader.Connection];/// <summary>/// Pragma 标头,指定特定于实现的指令,这些指令可应用到请求/响应链上的任意代理。用来包含实现特定的指令。/// </summary>public String Pragma => this[HttpRequestHeader.Pragma];/// <summary>/// 源头/// </summary>public String Origin{get => this["Origin"];set => this["Origin"] = value;}/// <summary>/// 客户端支持的扩展列表/// </summary>public String SecWebSocketExtensions{get => this["Sec-WebSocket-Extensions"];set => this["Sec-WebSocket-Extensions"] = value;}/// <summary>/// 请求标识key/// </summary>public String SecWebSocketKey{get => this["Sec-WebSocket-Key"];set => this["Sec-WebSocket-Key"] = value;}/// <summary>/// WebSocket版本/// </summary>public String SecWebSocketVersion => this["Sec-WebSocket-Version"];/// <summary>/// Upgrade 标头,指定客户端支持的其他通信协议。向服务器指定某种传输协议以便服务器进行转换。/// </summary>public String Upgrade => this[HttpRequestHeader.Upgrade];/// <summary>/// User-Agent 标头,指定有关客户端代理的信息。标识浏览器的详细信息,包括名称、版本、操作系统等。/// </summary>public String UserAgent{get => this[HttpRequestHeader.UserAgent];set => this[HttpRequestHeader.UserAgent] = value;}/// <summary>/// Accept-Charset 标头,指定响应可接受的内容编码。指定客户端可以接受的压缩编码类型/// </summary>public AcceptEncodingType AcceptEncoding{get => this[HttpRequestHeader.AcceptEncoding].ToUpper().ToCast<AcceptEncodingType>();set => this[HttpRequestHeader.AcceptEncoding] = value.ToLower();}/// <summary>/// Cache-Control 标头,指定请求/响应链上所有缓存控制机制必须服从的指令。如 no-cache、max-age 等。/// </summary>public String CacheControl => this[HttpRequestHeader.CacheControl];/// <summary>/// Accept-Langauge 标头,指定用于响应的首选自然语言。。/// </summary>public String AcceptLanguage{get => this[HttpRequestHeader.AcceptLanguage];set => this[HttpRequestHeader.AcceptLanguage] = value;}/// <summary>/// Referer 标头,指定可从中获取请求 URI 的资源 URI。/// </summary>public String Referer{get => this[HttpRequestHeader.Referer];set => this[HttpRequestHeader.Referer] = value;}/// <summary>/// From 标头,指定控制请求的用户代理的用户的 Internet 电子邮件地址。/// </summary>public String From{get => this[HttpRequestHeader.From];set => this[HttpRequestHeader.From] = value;}/// <summary>/// Authorization 标头,指定客户端提供的以向服务器验证自身身份的凭据。 凭证是 (用户名:密码)的base64/// </summary>/// <remarks>/// <para>假设用户名为jacky密码为eelf.cn则代码就是/// <code>Convert.ToBase64String(Encoding.UTF8.GetBytes("jacky:eelf.cn"))</code>/// </para>/// <code>/// 则上面的帐号密码输出为以下/// /// Authorization: Basic amFja3k6ZWVsZi5jbg==/// </code>/// </remarks>public String Authorization{get => this[HttpRequestHeader.Authorization];set => this[HttpRequestHeader.Authorization] = value;}/// <summary>/// Proxy-Authorization 标头,指定客户端提供的以向代理验证自身身份的凭据。/// </summary>/// <remarks>/// 设置参照 <see cref="Authorization"/> 属性设置/// </remarks>public String ProxyAuthorization{get => this[HttpRequestHeader.ProxyAuthorization];set => this[HttpRequestHeader.ProxyAuthorization] = value;}/// <summary>///  Cookie 标头,指定向服务器提供的 cookie 数据。/// </summary>public String Cookie{get => this[HttpRequestHeader.Cookie];set => this[HttpRequestHeader.Cookie] = value;}/// <summary>///  Content-Encoding 标头,指定应用到随附的正文数据的编码。/// </summary>public String ContentEncoding{get => this[HttpRequestHeader.ContentEncoding];set => this[HttpRequestHeader.ContentEncoding] = value;}/// <summary>///  Content-Language 标头,指定随附的正文数据的自然语言。/// </summary>public String ContentLangauge{get => this[HttpRequestHeader.ContentLanguage];set => this[HttpRequestHeader.ContentLanguage] = value;}/// <summary>///  Content-MD5 标头,指定随附的正文数据的 MD5 摘要,以便提供端到端消息完整性检查。 由于 MD5 出现冲突问题,Microsoft 建议使用基于SHA256 或更高版本的安全模型。/// </summary>public String ContentMd5{get => this[HttpRequestHeader.ContentMd5];set => this[HttpRequestHeader.ContentMd5] = value;}/// <summary>/// 自定义协议标头。/// </summary>private WebHeaderCollection WebHeader { get; set; }#endregion#region 方法/// <summary>/// 设置协议标头信息/// </summary>/// <param name="key">协议标头key</param>/// <param name="value">协议标头value</param>public void Set(string key, string value){if (key.IsNullOrEmpty()) return;if (this.WebHeader == null) this.WebHeader = new WebHeaderCollection();this.WebHeader.Set(key, value);}/// <summary>/// 设置协议标头信息/// </summary>/// <param name="header">协议标头key <see cref="HttpRequestHeader"/></param>/// <param name="value">协议标头value</param>public void Set(HttpRequestHeader header, string value){if (this.WebHeader == null) this.WebHeader = new WebHeaderCollection();this.WebHeader.Set(header, value);}/// <summary>/// 设置协议标头信息/// </summary>/// <param name="header">协议标头 key <see cref="HttpResponseHeader"/></param>/// <param name="value">协议标头 value</param>public void Set(HttpResponseHeader header, string value){if (this.WebHeader == null) this.WebHeader = new WebHeaderCollection();this.WebHeader.Set(header, value);}/// <summary>/// 添加协议标头信息/// </summary>/// <param name="key">协议标头 key</param>/// <param name="value">协议标头 value</param>public void Add(string key, string value){if (key.IsNullOrEmpty()) return;if (this.WebHeader == null) this.WebHeader = new WebHeaderCollection();this.WebHeader.Add(key, value);}/// <summary>/// 添加协议标头信息/// </summary>/// <param name="header">协议标头 key <see cref="HttpRequestHeader"/></param>/// <param name="value">协议标头 value</param>public void Add(HttpRequestHeader header, string value){if (this.WebHeader == null) this.WebHeader = new WebHeaderCollection();this.WebHeader.Add(header, value);}/// <summary>/// 添加协议标头信息/// </summary>/// <param name="header">协议标头 key <see cref="HttpResponseHeader"/></param>/// <param name="value">协议标头 value</param>public void Add(HttpResponseHeader header, string value){if (this.WebHeader == null) this.WebHeader = new WebHeaderCollection();this.WebHeader.Add(header, value);}/// <summary>/// 获取协议标头数据/// </summary>/// <param name="header">协议标头 key <see cref="HttpRequestHeader"/></param>/// <returns>协议标头值</returns>public string Get(HttpRequestHeader header){if (this.WebHeader == null) return String.Empty;return this.WebHeader[header];}/// <summary>/// 获取协议标头数据/// </summary>/// <param name="key">协议标头 key</param>/// <returns>协议标头值</returns>public string Get(string key){if (this.WebHeader == null) return String.Empty;return this.WebHeader[key];}/// <summary>/// 获取响应协议标头数据/// </summary>/// <param name="header">响应协议标头key <see cref="HttpResponseHeader"/></param>/// <returns>响应协议标头数据</returns>public string Get(HttpResponseHeader header){if (this.WebHeader == null) return String.Empty;return this.WebHeader[header];}/// <summary>/// 转成协议标头字符串/// </summary>/// <returns>合并协议标头字符串</returns>public override string ToString(){var sbr = new StringBuilder();sbr.AppendLine($"{this.Method} {this.Uri?.PathAndQuery} HTTP/{((float)this.HttpVersion) / 10F}");sbr.Append(this.WebHeader.ToString());return sbr.ToString();}#endregion
}

从上边的代码可以看出来,所有http请求的头基本上都有,如果自定义的头信息怎么办,那么就用当前配置的Add方法来添加。

开源地址:XiaoFeng

如果喜欢可以给作者点个星哦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/53717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML总结1【转】

以下内容转载和参考自&#xff1a;w3school的HTML学习内容&#xff0c;HTML 简介 。 一、概述 HTML不是一种编程语言&#xff0c;它是超文本标记语言 (Hyper Text Markup Language)&#xff0c;使用标记标签来描述网页内容。HTML标签是由尖括号包围的关键词&#xff0c;标签通…

机器学习笔记:KD树

1 引入原因 K近邻算法需要在整个数据集中搜索和测试数据x最近的k个点&#xff0c;如果一一计算&#xff0c;然后再排序&#xff0c;开销过大 引入KD树的作用就是对KNN搜索和排序的耗时进行改进 2 KD树 2.1 主体思路 以空间换时间&#xff0c;利用训练样本集中的样本点&…

HTTPS协议加密原理

目录 一、什么是HTTPS 二、什么是加密/解密 三、为什么要加密 四、常见的加密方式 1.对称加密 2. 非对称加密 五、HTTPS加密方式探讨 1.只使用对称加密 2.只使用非对称加密 3.非对称加密对称加密 4.非对称加密对称加密CA认证 六、总结 一、什么是HTTPS HTTP 协议&a…

Oracle dataguard 和Oracle rac的区别和联系

RAC服务器共用一套存储,同时提供服务,没有主备之分.宕一个其它的可以继续服务. 双机热备,共用一套存储,一个提供服务一个备份,主机宕了切换到备份服务器提供服务. data guard 完全两套系统,存储是单独的,用日志同步. RAC&#xff1a; 实例层冗余 DG &#xff1a;数据库层冗…

Pytorch06-复杂模型构建

https://github.com/ExpressGit/Pytorch_Study_Demo 1、PyTorch 复杂模型构建 1、模型截图2、模型部件实现3、模型组装 2、模型定义 2.1、Sequential 1、当模型的前向计算为简单串联各个层的计算时&#xff0c; Sequential 类可以通过更加简单的方式定义模型。2、可以接收…

HTML5岗位技能实训室建设方案

一 、系统概述 HTML5岗位技能技术是计算机类专业重要的核心课程&#xff0c;课程所包含的教学内容多&#xff0c;实践性强&#xff0c;并且相关技术更新快。传统的课堂讲授模式以教师为中心&#xff0c;学生被动式接收&#xff0c;难以调动学生学习的积极性和主动性。混合式教学…

2023年Java核心技术面试第八篇(篇篇万字精讲)

目录 十五 . 面向对象的基本要素&#xff1a;封装&#xff0c;继承&#xff0c;多态 15.1 封装&#xff1a; 15.1.1 例子&#xff1a; 15.2 继承 15.2.1 例子 15.3 多态 15.3.1 例子 15.3.2 小结&#xff1a;谈谈多态的继承的联系 十五 . 面向对象的基本要素&#xff1a;封装&a…

Linux--进程地址空间

1.线程地址空间 所谓进程地址空间&#xff08;process address space&#xff09;&#xff0c;就是从进程的视角看到的地址空间&#xff0c;是进程运行时所用到的虚拟地址的集合。 简单地说&#xff0c;进程就是内核数据结构和代码和本身的代码和数据&#xff0c;进程本身不能…

【Linux】socket 编程基础

文章目录 &#x1f4d5; 网络间的通信&#x1f4d5; socket 是什么1. socket 套接字2. 套接字描述符3. 基本的 socket 接口函数3.1 头文件3.2 socket() 函数3.3 bind() 函数struct sockaddr主机序列与网络序列 3.4 listen() 函数3.5 connect() 函数3.6 accept() 函数IP 地址风格…

3.BGP状态机和路由注入方式

BGP状态机 BGP路由的生成 不同于IGP路由协议,BGP自身并不会发现并计算产生路由,BGP将GP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。 BGP注入路由的方式有两种: Networkimport-route与IGP协议相同,BGP支持根据已有的路由条目进行聚合,生成聚合路由…

Java 时间日期处理,工作必用(建议收藏)

工作中经常会遇到对时间日期进行处理的业务&#xff0c;像日期类的API个人觉得不需要背&#xff0c;需要的时候去查资料就行。我整理了Java8之前及之后日期类常用的时间日期处理方法&#xff0c;方便工作需要时查找&#xff0c;觉得有用的朋友可以收藏。 一、日期格式化和解析 …

linux挂载内网镜像源文件,支持yum安装

cd /etc/yum.repos.d/vim kylin_aarch64.repo 重建yum缓存 yum clean allyum makecacheyum repolist

RH1288V3 - 初识物理服务器

如果你拥有一台物理服务器(不是云服务器) 个人比较推荐你用物理服务器&#xff0c;虽然性能会比云要来的差&#xff0c;但是不用每月交钱上。云服务固然方便&#xff0c;但是几个核的性能和一点存储&#xff0c;想做一个动漫网站固然要很多mp4这种影视资源&#xff0c;云服务器…

设计模式二十一:状态模式(State Pattern)

一个对象的内部状态发生变化时&#xff0c;允许对象改变其行为。这种模式使得一个对象看起来好像在运行时改变了它的类&#xff0c;主要目的是将状态的行为从主要对象中分离出来&#xff0c;使得主要对象不必包含所有状态的逻辑&#xff0c;而是将每个状态的行为封装在独立的类…

积跬步至千里 || 数学基础、算法与编程

数学基础、算法与编程 1. BAP 技能 BAP 技能是指基础(Basic)、算法(Algorithm)和编程(Programm)三种基本技能的深度融合。理工科以数学、算法与编程为根基&#xff0c;这三个相辅相成又各有区别。 &#xff08;1&#xff09;数学以线性代数为主要研究工具和部分微积分技术为手…

最新绕过目标域名CDN进行信息收集技术

绕过目标域名CDN进行信息收集 1&#xff0e;CDN简介及工作流程 CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;的目的是通过在现有的网络架构中增加一层新的Cache&#xff08;缓存&#xff09;层&#xff0c;将网站的内容发布到最接近用户的网…

打开软件提示msvcp140.dll丢失的解决方法,msvcp140主要丢失原因

今天&#xff0c;我将为大家介绍一种非常常见的问题——msvcp140.dll丢失。这个问题可能会导致许多应用程序无法正常运行&#xff0c;甚至崩溃。但是&#xff0c;请不要担心&#xff0c;我会为大家提供5种解决方法&#xff0c;帮助大家轻松解决问题。 首先&#xff0c;我们来看…

Android 全局监听软键盘弹起隐藏 动态修改布局并适配无限循环的问题

思路&#xff1a; 要在 Android 应用中全局检测软键盘的弹起&#xff0c;您可以使用 ViewTreeObserver.OnGlobalLayoutListener 监听器来监听布局树的变化。当软键盘弹起或隐藏时&#xff0c;布局树会发生变化&#xff0c;因此您可以在监听器中捕获这些变化。 以下是一个示例…

单片机学习-蜂鸣器电子元件

蜂鸣器是有什么作用的&#xff1f; 蜂鸣器 是 一种 一体化结构 的电子训响器&#xff0c;可以发出声音的电子元器件 蜂鸣器分类&#xff1f; ①压电式蜂鸣器&#xff08;图左&#xff09; 称&#xff1a; 无源蜂鸣器 ②电磁式蜂鸣器&#xff08;图右&#xff09; 称&#xf…

陪诊系统源码开发:实现个性化医疗陪护的创新之路

陪诊系统的源码开发在现代医疗中具有重要意义。本文将通过代码示例介绍陪诊系统的源码开发&#xff0c;展示如何实现个性化医疗陪护的创新方案。 1. 安装和环境设置&#xff1a; 首先&#xff0c;确保你的开发环境中已经安装了合适的编程语言和框架&#xff0c;比如Python和…