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());
            }
        }
    }

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

相关推荐
ALex_zry1 小时前
Golang云端编程深度指南:架构本质与高阶实践
开发语言·架构·golang
ALex_zry2 小时前
Go语言中的迭代器模式与安全访问实践
安全·golang·迭代器模式
君万2 小时前
【go语言】字符串函数
爬虫·python·golang
星夜泊客2 小时前
C# 浮点数与定点数详细解析
开发语言·c#·定点数·浮点数
好学且牛逼的马11 小时前
GOLANG 接口
开发语言·golang
CTRA王大大13 小时前
【golang】制作linux环境+golang的Dockerfile | 如何下载golang镜像源
linux·开发语言·docker·golang
#include>13 小时前
【Golang】有关垃圾收集器的笔记
笔记·golang
BIGFISH201917 小时前
上下相机引导贴合的标定(绝对坐标方式)
c#
우리帅杰18 小时前
【golang】ORM框架操作数据库
golang
秦禹辰19 小时前
本地Docker部署开源Web相册图库Piwigo与在线远程访问实战方案
开发语言·后端·golang