如何使用go实现创建WebSocket服务器

 更新时间:2024年11月09日 10:44:10   作者:半桶水专家  
文章介绍了如何使用Go语言和gorilla/websocket库创建一个简单的WebSocket服务器,并实现商品信息的实时广播,感兴趣的朋友一起看看吧

使用Go语言创建WebSocket服务器可以利用现有的库来简化开发过程。gorilla/websocket 是一个非常流行且功能强大的库,适用于Go语言的WebSocket应用。下面是一个详细的步骤指南,介绍如何使用 gorilla/websocket 创建一个WebSocket服务器,并实现商品信息的实时广播。

安装依赖

首先,你需要安装 gorilla/websocket 库。可以通过以下命令安装:

go get github.com/gorilla/websocket

创建WebSocket服务器

接下来,我们将创建一个简单的WebSocket服务器,该服务器可以接收客户端连接,并向所有连接的客户端广播商品信息。

1. 导入必要的包

package main
import (
    "fmt"
    "log"
    "net/http"
    "time"
    "github.com/gorilla/websocket"
)

2. 设置WebSocket升级器

WebSocket连接需要通过HTTP握手来建立。gorilla/websocket 提供了一个 Upgrader 结构体来处理这个过程。

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    // 允许跨域访问
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

3. 创建WebSocket处理器

定义一个函数来处理WebSocket连接。在这个函数中,我们将读取消息并广播商品信息。

func serveWs(w http.ResponseWriter, r *http.Request) {
    // 升级HTTP连接到WebSocket连接
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println("Failed to set websocket upgrade:", err)
        return
    }
    defer conn.Close()
    // 模拟商品添加事件
    for {
        item := map[string]interface{}{
            "id":    1,
            "name":  "Apple",
            "price": 2.5,
        }
        // 将商品信息发送给客户端
        err := conn.WriteJSON(item)
        if err != nil {
            log.Println("Error writing message:", err)
            break
        }
        // 每隔5秒发送一次
        time.Sleep(5 * time.Second)
    }
}

4. 注册路由并启动HTTP服务器

最后,我们需要注册路由并启动HTTP服务器。

func main() {
    http.HandleFunc("/ws", serveWs)
    fmt.Println("Starting server on :8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

完整代码

将上述代码片段组合在一起,得到完整的WebSocket服务器代码:

package main
import (
    "fmt"
    "log"
    "net/http"
    "time"
    "github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}
func serveWs(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println("Failed to set websocket upgrade:", err)
        return
    }
    defer conn.Close()
    for {
        item := map[string]interface{}{
            "id":    1,
            "name":  "Apple",
            "price": 2.5,
        }
        err := conn.WriteJSON(item)
        if err != nil {
            log.Println("Error writing message:", err)
            break
        }
        time.Sleep(5 * time.Second)
    }
}
func main() {
    http.HandleFunc("/ws", serveWs)
    fmt.Println("Starting server on :8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

运行服务器

保存文件并运行:

go run main.go

测试连接

你可以使用任何WebSocket客户端工具(如浏览器的开发者工具)来测试连接。连接到 ws://localhost:8080/ws,你应该每5秒接收到一次商品信息。

扩展功能

  • 多客户端支持:可以在服务器端维护一个连接列表,以便向所有连接的客户端广播消息。
  • 消息类型:可以定义不同的消息类型,以便客户端根据消息类型做出相应的处理。
  • 错误处理:添加更详细的错误处理和日志记录,以便更好地调试和监控。

到此这篇关于用go实现创建WebSocket服务器的文章就介绍到这了,更多相关go WebSocket服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言开发区块链只需180行代码(推荐)

    Go语言开发区块链只需180行代码(推荐)

    这篇文章主要介绍了Go语言开发区块链只需180行代码,文章中将不会涉及工作量证明算法(PoW)以及权益证明算法(PoS)这类的共识算法。需要的朋友可以参考下
    2018-05-05
  • golang中为什么Response.Body需要被关闭详解

    golang中为什么Response.Body需要被关闭详解

    这篇文章主要给大家介绍了关于golang中为什么Response.Body需要被关闭的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • 从零开始学Golang的接口

    从零开始学Golang的接口

    本文主要介绍了从零开始学Golang的接口,原文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • golang开发微框架Gin的安装测试及简介

    golang开发微框架Gin的安装测试及简介

    这篇文章主要为大家介绍了golang微框架Gin的安装测试及简介,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • 利用Go语言实现二叉搜索树

    利用Go语言实现二叉搜索树

    二叉树是一种常见并且非常重要的数据结构,在很多项目中都能看到二叉树的身影,当然它也有很多变种,本文要介绍的是二叉搜索树的实现,希望对大家有所帮助
    2023-07-07
  • 深入理解Go语言中的结构体

    深入理解Go语言中的结构体

    本文主要介绍了深入理解Go语言中的结构体,包括定义结构体、声明结构体变量、使用结构体、结构体关联函数、new、组合等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • Golang多模块开发的详细过程

    Golang多模块开发的详细过程

    这篇文章主要给大家介绍了关于Golang多模块开发的详细过程,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • golang值接收者和指针接收者的区别介绍

    golang值接收者和指针接收者的区别介绍

    这篇文章主要介绍了golang值接收者和指针接收者的区别,它和函数的区别在于方法有一个接收者,给一个函数添加一个接收者,那么它就变成了方法,接收者可以是值接收者,也可以是指针接收者,本文通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • golang函数的返回值实现

    golang函数的返回值实现

    本文主要介绍了golang函数的返回值实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • golang下的viper包的简单使用方式

    golang下的viper包的简单使用方式

    这篇文章主要介绍了golang下的viper包的简单使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论