如何使用go实现创建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服务器内容请搜索恩蓝小号以前的文章或继续浏览下面的相关文章希望大家以后多多支持恩蓝小号!

原创文章,作者:LSPKW,如若转载,请注明出处:https://www.wangzhanshi.com/n/5605.html

(0)
LSPKW的头像LSPKW
上一篇 2024年12月17日 19:27:46
下一篇 2024年12月17日 19:27:48

相关推荐

  • golang套接字的实现

    在 Go 语言中,使用标准库 net 来实现套接字编程。以下是有关 Go 套接字的基本概念和示例。 1. 基本概念 网络类型: TCP:流套接字,提供可靠的、面…

    Golang 2024年12月17日
  • 使用Go语言实现找出两个大文件中相同的记录

    在 Go 语言中找出两个大文件中相同的记录,可以采用以下策略: 思路 读文件:按行逐行读取两个文件中的记录,假设每个文件的每一行代表一条记录。 使用哈希集合(Set):因为哈希集合…

    Golang 2024年12月17日
  • go语言中数据接口set集合的实现

    概述 set 是一种常用的数据结构,它表示一组唯一元素的集合。在不同的编程语言和库中,set 可能有不同的实现方式和特性。 set 集合数据结构具有以下特性: 唯一性:set 中的…

    2024年12月17日
  • Go中的Context实现原理以及正确使用方式

    1. 基本原理 1.1 Context 包的介绍 在 Go 语言中,Context 包是用于传递请求范围数据、取消信号和截止时间的机制。它通常被用来处理 goroutine 之间的…

    Golang 2024年12月17日
  • 获取Golang环境变量的三种方式小结

    环境变量是应用软件参数配置的最佳方式,可以定义系统级,如开发、测试以及生成阶段。配置参数主要有数据库配置、第三方url等。因此环境变量对于开发和部署应用至关重要。 环境变量和配置文…

    Golang 2024年12月17日
  • Golang构建WebSocket服务器和客户端的示例详解

    简介 本教程将教你如何使用Go语言构建WebSocket服务器和客户端,以实现双向 通信。我们将介绍如何创建一个WebSocket服务器,用于接收来自客户端的消息,以及如何创建一个…

    Golang 2024年12月29日
  • Go语言中iota的具体使用

    1. 简介 在Go语言中,iota是一个常量生成器,主要用于生成一系列相关值,常被用于枚举。其功能强大,常见于日常开发中的一些常量定义、位操作等场景。 2. 基础用法 packag…

    Golang 2024年12月17日
  • Golang调用FFmpeg转换视频流的实现

    问题背景 问题背景是在,由于视频采集端使用的是H264编码采集的裸流,而网络流媒体大多是以FLV为主的直播方式进行的,为了实现实时直播,当前是打算直接使用FFmpeg将H264裸流…

    Golang 2024年12月29日
  • golang进行xml文件解析的操作方法

    查阅了些资料自己记录一下 一、小文件简单解析 对于小文件的 XML 解析,我们可以使用 Go 标准库中的encoding/xml包来实现。 假设我们有一个名为demo.xml的文件…

    Golang 2024年12月17日
  • go中值传递和指针传递的使用

    1、& 和 * &后跟一个变量名,得到的是这个变量的内存地址 *int类型的变量,代表这个变量里存的值是int类型的变量的内存地址 数据类型的指针类型,即在其前面加…

    2024年12月17日

发表回复

登录后才能评论