用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秒接收到一次商品信息。
扩展功能
- 多客户端支持:可以在服务器端维护一个连接列表,以便向所有连接的客户端广播消息。
- 消息类型:可以定义不同的消息类型,以便客户端根据消息类型做出相应的处理。
- 错误处理:添加更详细的错误处理和日志记录,以便更好地调试和监控。