首页 > 编程语言 >如何在 Go 中创建 WebSocket 应用程序

如何在 Go 中创建 WebSocket 应用程序

时间:2023-05-27 21:33:07浏览次数:40  
标签:http err 应用程序 ws func error Go WebSocket

如何在 Go 中创建 WebSocket 应用程序_服务器


要基于 net/http 库编写一个简单的 WebSocket 回显服务器,您需要:

  1. 发起握手
  2. 从客户端接收数据帧
  3. 向客户端发送数据帧
  4. 关闭握手


首先,让我们创建一个带有 WebSocket 端点的 HTTP 处理程序:

// HTTP server with WebSocket endpoint
        func Server() {
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
            ws, err := NewHandler(w, r)
            if err != nil {
                 // handle error
            }
            if err = ws.Handshake(); err != nil {
                // handle error
            }
        …

然后初始化WebSocket结构。

初始握手请求始终来自客户端。一旦服务器定义了 WebSocket 请求,它需要用握手响应进行回复。

请记住,您不能使用 http.ResponseWriter 编写响应,因为一旦您开始发送响应,它将关闭底层 TCP 连接。

所以你需要使用HTTP劫持。劫持允许您接管底层 TCP 连接处理程序和 bufio.Writer。这使您可以在不关闭 TCP 连接的情况下读取和写入数据。

// NewHandler initializes a new handler
        func NewHandler(w http.ResponseWriter, req *http.Request) (*WS, error) {
        hj, ok := w.(http.Hijacker)
        if !ok {
            // handle error
        }                  .....
}

要完成握手,服务器必须使用适当的标头进行响应。

// Handshake creates a handshake header
    func (ws *WS) Handshake() error {
        
        hash := func(key string) string {
            h := sha1.New()
            h.Write([]byte(key))
            h.Write([]byte("258EAFA5-E914-47DA-95CA-C5AB0DC85B11"))

        return base64.StdEncoding.EncodeToString(h.Sum(nil))
        }(ws.header.Get("Sec-WebSocket-Key"))
      .....
}

“Sec-WebSocket-key”是随机生成的,是 Base64 编码的。服务器在接受请求后需要将此密钥附加到固定字符串。假设您有 x3JJHMbDL1EzLkh9GBhXDw== 密钥。在这种情况下,您可以使用 SHA-1 计算二进制值并使用 Base64 对其进行编码。你会得到 HSmrc0sMlYUkAGmm5OPpG2HaGWk=。将此用作 Sec-WebSocket-Accept 响应标头的值。

标签:http,err,应用程序,ws,func,error,Go,WebSocket
From: https://blog.51cto.com/yuzhou1su/6363133

相关文章

  • [golang]gin框架接收websocket通信
    前言WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket让客户端和服务端之间的数据交换变得非常简单,且允许服务器主动向客户端推送数据,并且之后客户端和服务端所有的通信都依靠这个专用协议进行。本文使用gin框架编写服务端应用,配置路由接收websocket请求并处理。......
  • springboot整合websocket
    一、引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId&g......
  • picgo+github搭建图床,配合typora使用
    picgo下载地址:https://github.com/Molunerfinn/PicGo/releases创建一个仓库,老的也行分支的话看看仓库里的分支是什么就填写什么token的设置typroa整合......
  • go语言中如何实现同步操作呢
    1.简介本文探讨了并发编程中的同步操作,讲述了为何需要同步以及两种常见的实现方式:sync.Cond和通道。通过比较它们的适用场景,读者可以更好地了解何时选择使用不同的同步方式。本文旨在帮助读者理解同步操作的重要性以及选择合适的同步机制来确保多个协程之间的正确协调和数据共享......
  • go语言中如何实现同步操作呢
    1.简介本文探讨了并发编程中的同步操作,讲述了为何需要同步以及两种常见的实现方式:sync.Cond和通道。通过比较它们的适用场景,读者可以更好地了解何时选择使用不同的同步方式。本文旨在帮助读者理解同步操作的重要性以及选择合适的同步机制来确保多个协程之间的正确协调和数据共享......
  • {{ form.as_ul }} – Render Django Forms as list
    DjangoformsareanadvancedsetofHTMLformsthatcanbecreatedusingpythonandsupportallfeaturesofHTMLformsinapythonicway.RenderingDjangoFormsinthetemplatemayseemmessyattimesbutwithproperknowledgeofDjangoFormsandattribut......
  • 修改开机动画和logo
    修改文件:  AllAudio.mk最后一行添加内容: ......
  • gitee 流水线部署go程序
    1、在gitee上新建gotest项目,为了方便演示,main.go代码简略如下packagemainfuncmain(){println("helloworld")}2、编写makefile文件3、创建流水线,选择go项目4、修改部署规则5、测试运行,看到最后输出了go程序的输出helloworld,说明部署成功......
  • 基于GoogleNet深度学习网络的人员身份识别系统Matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:  2.算法涉及理论知识概要       深度学习(DL,DeepLearning)是机器学习(ML,MachineLearning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI,ArtificialIntelligence)。[1深度学习是学习样本数据......
  • 基于GoogleNet深度学习网络的人员身份识别系统Matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要深度学习(DL,DeepLearning)是机器学习(ML,MachineLearning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI,ArtificialIntelligence)。[1深度学习是学习样本数据的内在规律和表示层次,这......