使用Go语言创建WebSocket服务器可以利用现有的库来简化开发过程。gorilla/websocket 是一个非常流行且功能强大的库,适用于Go语言的WebSocket应用。下面是一个详细的步骤指南,介绍如何使用 gorilla/websocket 创建一个WebSocket服务器,并实现商品信息的实时广播。
首先,你需要安装 gorilla/websocket 库。可以通过以下命令安装:
1 |
go get github.com/gorilla/websocket |
接下来,我们将创建一个简单的WebSocket服务器,该服务器可以接收客户端连接,并向所有连接的客户端广播商品信息。
1 2 3 4 5 6 7 8 |
package main import ( "fmt" "log" "net/http" "time" "github.com/gorilla/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 }, } |
定义一个函数来处理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) } } |
最后,我们需要注册路由并启动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秒接收到一次商品信息。