广告位联系
返回顶部
分享到

使用go实现创建WebSocket服务器

Golang 来源:互联网 作者:佚名 发布时间:2024-11-10 08:13:30 人浏览
摘要

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

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

安装依赖

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

1

go get github.com/gorilla/websocket

创建WebSocket服务器

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

1. 导入必要的包

1

2

3

4

5

6

7

8

package main

import (

    "fmt"

    "log"

    "net/http"

    "time"

    "github.com/gorilla/websocket"

)

2. 设置WebSocket升级器

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

1

2

3

4

5

6

7

8

var upgrader = websocket.Upgrader{

    ReadBufferSize:  1024,

    WriteBufferSize: 1024,

    // 允许跨域访问

    CheckOrigin: func(r *http.Request) bool {

        return true

    },

}

3. 创建WebSocket处理器

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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服务器。

1

2

3

4

5

6

7

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服务器代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

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)

    }

}

运行服务器

保存文件并运行:

1

go run main.go

测试连接

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

扩展功能

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

版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Python框架FastAPI详解介绍

    Python框架FastAPI详解介绍
    FastAPI是一种现代、快速(高性能)的Web框架,用于Python 3.6+,使用Python类型提示构建API。它的设计初衷是帮助开发者在短时间内开发出高性
  • 使用go实现创建WebSocket服务器
    使用Go语言创建WebSocket服务器可以利用现有的库来简化开发过程。gorilla/websocket是一个非常流行且功能强大的库,适用于Go语言的WebSocket应用
  • golang日志库ZAP[uber-go zap]示例介绍
    golang 日志库ZAP[uber-go zap] 1. 简要说明 zap 是 uber 开源的 Go 高性能日志库,支持不同的日志级别, 能够打印基本信息等,但不支持日志的分割
  • golang并发编程使用Select语句的实现介绍
    在 Go 语言中,select语句是一种控制结构,允许一个 Goroutine 同时等待多个通道操作。select语句会阻塞,直到其中的一个case可以继续执行,然
  • go语言time.After()的作用介绍
    time.After是一个非常实用的函数,它返回一个用于读取的单向通道(-chan time.Time),这个通道会在指定的时间间隔之后发送当前时间。这个机
  • go实现一个内存缓存系统的代码
    面试内容: 支持设定过期时间,精度到秒 支持设定最大内存,当内存超出时做出合适的处理 支持并发安全 要求按照以下接口实现 1 2 3 4
  • Golang Map简介以及底层原理介绍
    在Go语言中提供了map数据结构来存储键值对数据。map的数据类型为map[K]V,其中K为键的类型,V为值的类型。map的键类型必须支持==操作符,用
  • Go语言中的switch高级用法介绍
    最近翻开源代码的时候看到了一种很有意思的switch用法,分享一下。 注意这里讨论的不是typed switch,也就是case语句后面是类型的那种。 直
  • Go语言sync.Map介绍及使用场景
    在 Go 语言中,sync.Map是一个并发安全的映射结构,专门用于在高并发场景下处理键值对数据。它的并发安全是通过内部实现机制来保证的,
  • 怎么使用工具自动监测SSL证书有效期并发送提醒
    自从云厂商的免费ssl证书改成3个月,而且证书数量还是20个之后,自己网站的ssl证书就换成了其它免费方案。但是免费方案不会提醒证书过
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计