websocket实现go(server)与c#(client)通讯

go 服务端

使用到github.com/gorilla/websocket

package mainimport ("fmt""github.com/gorilla/websocket""log""net/http"
)func main() {var upgrader = websocket.Upgrader{ReadBufferSize:  1024,WriteBufferSize: 1024,CheckOrigin: func(r *http.Request) bool {return true //允许跨域},}http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { //将所有的请求转换为websocketupgrader.CheckOrigin = func(r *http.Request) bool {return true}conn, err := upgrader.Upgrade(writer, request, nil)if err != nil {log.Fatal(err)}for {t, msg, err := conn.ReadMessage()if err != nil {fmt.Printf("read error:%v\n", err)break}fmt.Printf("[ws]recv count:%d recv:%s,msg type:%d\n", len(msg), string(msg), t)}})err := http.ListenAndServe("127.0.0.1:8081", nil)if err != nil {log.Fatal(err)}
}

C#客户端

C#操作websocket当客户端使用时使用System.Net.Websockets这个命名空间下的ClientWebSocket
winform的设计界面如下:

在这里插入图片描述
代码如下:

public partial class Form1 : Form{CancellationTokenSource tokenSource = new CancellationTokenSource();System.Net.WebSockets.ClientWebSocket client = new System.Net.WebSockets.ClientWebSocket();public Form1(){InitializeComponent();}private async void button1_Click(object sender, EventArgs e){try{var content=this.rtbContent.Text;if (string.IsNullOrEmpty(content)){MessageBox.Show("请输入内容来发送");return;}if (client.State != System.Net.WebSockets.WebSocketState.Open){tokenSource = new CancellationTokenSource();client = new System.Net.WebSockets.ClientWebSocket();//client.Options.KeepAliveInterval = TimeSpan.FromSeconds(1);await client.ConnectAsync(new Uri("ws://127.0.0.1:8081"), tokenSource.Token);var bytes = new byte[10240];var array = new ArraySegment<byte>(bytes);Task.Factory.StartNew(async () =>{while (true){try{var msg = await client.ReceiveAsync(array, tokenSource.Token);}catch (Exception ex){MessageBox.Show(ex.Message);tokenSource.Cancel();return;}}});}var buffer = Encoding.UTF8.GetBytes(content);await client.SendAsync(new ArraySegment<byte>(buffer), System.Net.WebSockets.WebSocketMessageType.Text, true, tokenSource.Token);MessageBox.Show($"已发送{buffer.Length}个字节");}catch (Exception ee){MessageBox.Show(ee.ToString());}}}

注意:无论是客户端断开还是服务端断开,如果正在读取消息,则会触发错误。利用此机制可以很方便的处理重连问题。

在这里插入图片描述

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

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

相关文章

PDF有限制不能复制怎么办?

大家现在接触PDF文件越来越多&#xff0c;有的时候在网上下载的PDF文件打开之后&#xff0c;发现选中文字之后无法复制。甚至其他功能也都无法使用&#xff0c;这是怎么回事&#xff1f;该怎么办&#xff1f; 当我们发现文件打开之后&#xff0c;编辑功能无法使用&#xff0c;很…

如何领取京东优惠券用微信支付还是用支付宝支付购买商品?

京东用微信支付还是用支付宝支付&#xff1f; 京东商城购物不支持支付宝支付&#xff0c;现京东商城支持的支付方式包括&#xff1a;京东支付、银行卡、信用卡、微信支付、云闪付等&#xff1b; 京东如何领取优惠券用微信支付购物&#xff1f; 1、打开京东APP&#xff0c;挑选…

Suricata + Wireshark离线流量日志分析

目录 一、访问一个404网址&#xff0c;触发监控规则 1、使用python搭建一个虚拟访问网址 2、打开Wireshark,抓取流量监控 3、在Suricata分析数据包 流量分析经典题型 入门题型 题目&#xff1a;Cephalopod(图片提取) 进阶题型 题目&#xff1a;抓到一只苍蝇(数据包筛选…

C语言进阶---程序环境和预处理

C语言进阶---程序环境和预处理 前言一、程序的翻译环境、执行环境二、详解&#xff1a;C语言程序的编译链接三、预定义符号介绍四、预处理指令 #define五、宏和函数的对比&#xff08;思维导图&#xff09;六、命令定义、预处理指令 #include #undef1.命名约定2.命令行定义 七、…

(5)SpringMVC处理携带JSON格式(“key“:value)请求数据的Ajax请求

SpringMVC处理Ajax 参考文章数据交换的常见格式,如JSON格式和XML格式 请求参数的携带方式 浏览器发送到服务器的请求参数有namevalue&...(键值对)和{key:value,...}(json对象)两种格式 URL请求和表单的GET请求会将请求参数以键值对的格式拼接到请求地址后面form表单的P…

nginx下载与安装教程

文章目录 nginx简介nginx的主要应用场景nginx开源项目的源码结构 使用centos7安装nginx检查centos版本号和linux内核版本检查是否安装gcc、pcre、zlib、openssl等依赖 安装nginx启动nginx停止nginx重启nginx nginx简介 nginx是一款业内流行、功能强大的web服务器。 高性能&…

Docker安装——Ubuntu (Jammy 22.04)

一、为什么要用 Ubuntu&#xff1f;(centos和ubuntu有什么区别&#xff09; 使用lsb_release命令&#xff1a;lsb_release -a &#xff0c;即可查看ubantu的版本&#xff0c;但是为什么要使用ubantu 呢&#xff1f; 区别&#xff1a;1、centos基于EHEL开发&#xff0c;而ubunt…

openGauss学习笔记-94 openGauss 数据库管理-访问外部数据库-mysql_fdw

文章目录 openGauss学习笔记-94 openGauss 数据库管理-访问外部数据库-mysql_fdw94.1 编译mysql_fdw94.2 使用mysql_fdw94.3 常见问题94.4 注意事项 openGauss学习笔记-94 openGauss 数据库管理-访问外部数据库-mysql_fdw openGauss的fdw实现的功能是各个openGauss数据库及远程…

xlsx使用table_to_book报错Uncaught Unsupported origin when DIV is not a TABLE

背景&#xff1a;const workbook XLSX.utils.table_to_book(document.querySelector(‘#table-export’),{ raw: true//保留原始字符串 })报错Uncaught Unsupported origin when DIV is not a TABLE 原因&#xff1a;el-table是div格式 过程1&#xff1a;获取深层次的table…

假期AI新闻热点:亚运会Al技术亮点;微软GPT-4V论文精读;Perplexity推出pplx-api;DALL-E 3多渠道测评 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f525; 科技感拉满&#xff0c;第19届杭州亚运会中的Al技术亮点 八年筹备&#xff0c;杭州第19届亚运会开幕式于9月23日晚隆重举行&#xff0…

SpringBoot——》更改Redis序列化方式

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

4.物联网射频识别,RFID开发【智能门禁项目】

补充&#xff1a;学习路径 一。项目介绍及需求分析 1.酒店智能门禁使用场景介绍 1.客人入住 客人在前台办理入住手续&#xff0c;前台管理员通过门禁管理系统为客户开一张门禁卡 客户持卡到相应客房&#xff0c;用IC 卡刷卡开门 客人过了入住时间后&#xff0c;卡自动失效&a…