技术标签: c# websocket C# .net 异步操作 WebSocket
ClientWebSocket
这里用到的核心代码就是ClientWebSocket
类。提供用于连接到WebSocket服务的客户端。
csharp public sealed class ClientWebSocket : System.Net.WebSockets.WebSocket
属性 | 作用 |
---|---|
CloseStatus |
获取在ClientWebSocket实例上启动关闭握手的原因。 |
CloseStatusDescription |
获取对关闭ClientWebSocket实例的原因的描述。 |
Options |
获取ClientWebSocket实例的WebSocket选项。 |
State |
获取ClientWebSocket实例的WebSocket状态。 |
SubProtocol |
获取ClientWebSocket实例支持的WebSocket子协议。 |
方法 | 作用 |
---|---|
Abort() |
中止连接并取消任何挂起的IO操作。 |
CloseAsync(WebSocketCloseStatus, String, CancellationToken) |
关闭作为异步操作的ClientWebSocket 实例。 |
CloseOutputAsync(WebSocketCloseStatus, String, CancellationToken) |
关闭作为异步操作的ClientWebSocket 实例的输出。 |
ConnectAsync(Uri, CancellationToken) |
连接到WebSocket服务器以作为异步操作。 |
Dispose() |
释放ClientWebSocket 实例使用的非托管资源。 |
Equals(Object) |
确定指定对象是否等于当前对象。(继承自Object ) |
GetHashCode() |
作为默认哈希函数。(继承自Object ) |
GetType() |
获取当前实例的Type 。(继承自Object ) |
MemberwiseClone() |
创建当前Object 的浅表副本。(继承自Object ) |
ReceiveAsync(ArraySegment<Byte>, CancellationToken) |
将ClientWebSocket 上的数据作为异步操作进行接收。 |
ReceiveAsync(Memory<Byte>, CancellationToken) |
将ClientWebSocket 上的数据作为异步操作进行接收。 |
SendAsync(ArraySegment<Byte>, WebSocketMessageType, Boolean, CancellationToken) |
以异步操作方式,发送ClientWebSocket 上的数据。 |
SendAsync(ReadOnlyMemory<Byte>, WebSocketMessageType, Boolean, CancellationToken) |
以异步操作方式,从只读字节内存范围发送ClientWebSocket 上的数据。 |
ToString() |
返回表示当前对象的字符串。(继承自Object ) |
以下是我项目中用到的父类实例,仅供参考:
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
/// <summary>WebSocket链接</summary>
public class WebSocketLink
{
public WebSocketLink(string url)
{
m_uri = new Uri(url);
m_client = new ClientWebSocket();
m_cToken = new CancellationToken();
}
protected readonly Uri m_uri = null;
/// <summary>WebSocket客户端对象</summary>
protected readonly ClientWebSocket m_client = null;
protected readonly CancellationToken m_cToken;
/// <summary>接收WebSocket返回的信息数据</summary>
protected WebSocketReceiveResult m_websocketReceiveResult = null;
/// <summary>byte数组,用于接收WebSocket返回的数据</summary>
protected byte[] m_byteArrBuffer = null;
/// <summary>接收WebSocket返回的字符串数据</summary>
protected string m_result = null;
/// <summary>是否循环(链接处于打开状态)</summary>
protected bool Loop {
get {
return m_client.State == WebSocketState.Open; } }
/// <summary>获取缓冲区的byte数组段</summary>
/// <param name="arr">byte数组内容</param>
/// <returns>结果byte数组段</returns>
protected ArraySegment<byte> GetBuffer(byte[] arr)
{
return new ArraySegment<byte>(arr);
}
/// <summary>获取缓冲区的byte数组段</summary>
/// <param name="str">字符串内容</param>
/// <returns>结果byte数组段</returns>
protected ArraySegment<byte> GetBuffer(string str)
{
return GetBuffer(Encoding.UTF8.GetBytes(str));
}
/// <summary>接收信息</summary>
/// <returns>返回值为WebSocketReceiveResult的Task</returns>
protected async Task<WebSocketReceiveResult> ReceiveMessage()
{
m_byteArrBuffer = new byte[1024];
WebSocketReceiveResult wsrResult = await m_client.ReceiveAsync(GetBuffer(m_byteArrBuffer), new CancellationToken());//接受数据
//Debug.Log(wsrResult.Count + "---" + wsrResult.EndOfMessage + "---" + wsrResult.MessageType);
m_result += Encoding.UTF8.GetString(m_byteArrBuffer, 0, wsrResult.Count);
return wsrResult;
}
/// <summary>解析结果</summary>
protected virtual void ParseResult()
{
}
/// <summary>网络报错</summary>
/// <param name="ex">错误信息</param>
protected virtual void WebSocketError(Exception ex)
{
Debug.LogError(ex.Message + "\n" + ex.StackTrace + "\n" + ex.Source + "\n" + ex.HelpLink);
}
/// <summary>连接、接收</summary>
public async void ConnectAuthReceive()
{
try
{
await m_client.ConnectAsync(m_uri, m_cToken);//连接
while (Loop)
{
//遍历接受信息
m_websocketReceiveResult = await ReceiveMessage();
if (m_websocketReceiveResult.EndOfMessage)
{
//接收完一条完整信息,解析
//Debug.Log("完整一条信息:" + m_result);
if (string.IsNullOrEmpty(m_result))
{
//正规闭包的返回值
break;
}
ParseResult();
}
}
}
catch (Exception ex)
{
WebSocketError(ex);
}
}
/// <summary>发送请求</summary>
/// <param name="text">请求信息内容</param>
public async Task SendRequest(string text)
{
if (m_client.State == WebSocketState.None) {
Debug.Log("未建立链接!"); return; }
await m_client.SendAsync(GetBuffer(text), WebSocketMessageType.Text, true, m_cToken);//发送数据
}
/// <summary>关闭</summary>
public async void Close()
{
if (m_client.State == WebSocketState.None) {
Debug.Log("未建立链接!"); return; }
await m_client.CloseAsync(WebSocketCloseStatus.NormalClosure, "正规闭包", m_cToken);
}
/// <summary>终止</summary>
public void Abort()
{
if (m_client.State == WebSocketState.None) {
Debug.Log("未建立链接!"); return; }
m_client.Abort();
}
}
async/await
代码中使用的是async/await
的异步编程:C# async/await异步编程。
文章浏览阅读521次。来自:http://blog.51cto.com/simeon/1981572作者介绍陈小兵,高级工程师,具有丰富的信息系统项目经验及18年以上网络安全经验,现主要从事网络安全及数据库技术研究工作。《黑客攻防及实战案例解析》《Web渗透及实战案例解析》《安全之路-Web渗透及实战案例解析第二版》《黑客攻防实战加密与解密》《网络攻防实战研究:漏洞利用与提权》作者,在国内多本学术期..._mysql 5.0.16入侵
文章浏览阅读135次。https://learn.microsoft.com/zh-cn/sql/ssms/release-notes-ssms?view=sql-server-ver16#previous-ssms-releases_sql server历史版本哪儿下
文章浏览阅读2.5k次。简介自学的【狂神JAVA】MyBatis分享自写源码和笔记,希望对大家有帮助本人配置jdk13.0.2 (jdk1.7以上均可)Maven 3.6.3MySQL 5.7.23 (mysql5.6以上均可)1. 配置官网文档: https://mybatis.org/mybatis-3/zh/getting-started.htmlpom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://_jdk1.7的mybatis
文章浏览阅读913次。调度中心的代码启动源码是从:XxlJobAdminConfig 入口;直接进入: xxlJobScheduler.init();第一个: initI18n() 处理国际化;第二个:JobRegistryMonitorHelper.getInstance().start(); 创建启动后台线程来维护在线的执行器组下的机器列表,从上篇学习笔记—分布式调度之xxlJob执行器的启动源码解析可以..._xxl 调度失败:执行器地址为空
文章浏览阅读1.3w次,点赞3次,收藏72次。之前贴出了代码,但是源码已经找不到了;鉴于很多同学私信想要参考,找时间重新写了一个工程一、参考代码1.不方便下载的同学可以参考贴出来的源代码链接:RS485二、基本知识1.RS485通信讲解:读30001、30002两个寄存器,假设从机地址为1上位机(主机)发送下行报文:01 03 00 03 00 02 34 0B从机地址功能码寄存器起始地址读取寄存器个数CRC校验010300 0300 0285 ca010300 0400 0285 ca上_485代码
文章浏览阅读1k次。http://www.sina.com.cn 2005年04月07日 11:19 新浪科技 文/李开复 人才:微软的立业之本 微软公司把重视人才的管理理念视为公司的核心财富。在信息时代里,人才的价值尤为重要。在工业时代里,一个优秀技工和一个普通技工的效率差异可能是30%,但在信息时代里,一个高级程序员和一个普通程序员的效率差异可能高达10倍以上。 ad1= "打造校_在微软许多人都像我一样主动从事发现人才、跟踪人才和吸引人才的工作....
文章浏览阅读2k次,点赞4次,收藏25次。(visual studio 2019可运行)输入及输出要求见《数据结构C语言(第二版)》严蔚敏版【本文仅用于啥都看不懂还想交作业选手】#include<iostream>#include<map>#include<string>#include<stdio.h>#include<memory.h>using namespace std;typedef struct{ char c; int weight; in_基于哈夫曼树的数据压缩算法c语言
文章浏览阅读1w次。Teams Bot App 代码解析_adaptivecards.declare(rawlearncard).render(this.likecountobj)
文章浏览阅读2.5k次。RawImage(Script)Texture 纹理 要显示的图片,注意:图片类型可以是任何类型 Color 颜色 图片的主颜色 Material 材质 渲染材质 Raycast Target 光线投射目标 是否可接收射线碰撞事件检测 UV Rect UV矩形 显示效果:X、Y属性用于控制纹理左右..._unity原始图像
文章浏览阅读2k次。随着互联网应用的复杂性增加,越来越多的公司选择使用微服务架构模式进行应用开发,将单体应用拆分成多个小型服务,每个服务部署在不同的服务器上。同时,为了提升系统的可用性、容错性和可扩展性,需要考虑分布式事务问题。本文将介绍 Spring Boot 在分布式事务中的一些实现方案,并给出相关原理。
文章浏览阅读2.8k次,点赞12次,收藏90次。权当学习笔记吧_黑马微信小程序笔记
采用Spring Boot框架进行后端开发,结合前端技术(如Vue.js、React等)进行页面设计,数据库采用MySQL进行数据存储,确保系统的稳定性和性能。本项目旨在设计并实现一个基于Spring Boot的旅游网站,为用户提供便捷的旅游信息查询、预订服务,以及旅游资讯分享功能,提升用户旅游体验。通过市场调研和用户需求分析,了解用户对旅游网站的需求和偏好,明确系统的功能和特点,确保系统能够满足用户的旅游需求。进行全面的系统测试,包括功能测试、性能测试、安全性测试和用户体验测试,确保系统的质量和可靠性。