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

go 服务端

使用到github.com/gorilla/websocket

go 复制代码
package main

import (
	"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) { //将所有的请求转换为websocket
		upgrader.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的设计界面如下:

代码如下:

csharp 复制代码
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());
            }
        }
    }

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

相关推荐
吾与谁归in3 分钟前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式
吾与谁归in4 分钟前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
ifanatic26 分钟前
[面试]-golang基础面试题总结
面试·职场和发展·golang
懒是一种态度34 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
神仙别闹1 小时前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
XINGTECODE1 小时前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
入 梦皆星河1 小时前
在 Ubuntu/Debian 上安装 Go
ubuntu·golang·debian
凡人的AI工具箱2 小时前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
刽子手发艺3 小时前
WebSocket详解、WebSocket入门案例
网络·websocket·网络协议
向宇it11 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎