Golang 中的 Websocket :如何实现双向通信? Websocket 是一种双向通信协议,它允许服务器和客户端在任何时候互相发送消息。在 Golang 中,我们可以很容易地使用标准库实现 Websocket,下面我们来看一下如何实现双向通信。 一、创建服务器 首先,我们需要创建一个服务器,为此我们调用 Go 标准库中的 http 包中的 Upgrade 函数。 在这个函数中,我们需要指定在升级请求时所要使用的协议,并在此之后对 websocket 连接进行处理。 下面是一个简单的实现。 ``` package main import ( "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } func handler(w http.ResponseWriter, r *http.Request) { // 将 HTTP 请求转换为 WebSocket 连接 conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Fatal(err) return } // 处理 WebSocket 连接 for { // 读取客户端发送的数据 _, message, err := conn.ReadMessage() if err != nil { log.Println(err) return } log.Printf("receive: %s", message) // 发送数据给客户端 err = conn.WriteMessage(websocket.TextMessage, message) if err != nil { log.Println(err) return } } } func main() { http.HandleFunc("/", handler) log.Fatal(http.ListenAndServe(":8080", nil)) } ``` 在这个例子中,我们将升级请求转换为一个 Websocket 连接,并在处理循环中读取和写入消息。我们将在下面的代码中实现客户端的发送和接收。 二、创建客户端 接下来,我们需要创建一个客户端来测试我们的服务器。同样地,我们需要使用标准库中的 websocket 包来建立连接,发送和接收消息。 下面是客户端的代码。 ``` package main import ( "fmt" "net/url" "github.com/gorilla/websocket" ) func main() { u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/"} fmt.Printf("connecting to %s\n", u.String()) // 建立连接 conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil) if err != nil { fmt.Println("dial:", err) return } defer conn.Close() // 发送消息 err = conn.WriteMessage(websocket.TextMessage, []byte("hello, world")) if err != nil { fmt.Println("write:", err) return } // 接收消息 _, message, err := conn.ReadMessage() if err != nil { fmt.Println("read:", err) return } fmt.Printf("receive: %s\n", message) } ``` 在这个例子中,我们使用 DefaultDialer.Dial 函数与服务器建立连接,发送一个消息,然后等待接收一个回复。 三、测试服务器和客户端 现在我们已经准备好测试我们的代码了。我们需要首先运行服务器,然后运行客户端。如果一切正常,你将看到以下输出。 ``` $ go run server.go ... $ go run client.go connecting to ws://localhost:8080/ receive: hello, world ``` 在这个例子中,我们成功地建立了一个 Websocket 连接,并进行双向通信。这是一个非常基本的示例,但它表明了如何在 Golang 中使用标准库的 websocket 包来实现这一目标。 总结 在本文中,我们介绍了如何在 Golang 中使用标准库实现 Websocket 的双向通信。我们需要实现一个服务器和一个客户端来测试通信。这是一个非常基础的示例,但是它足以让你开始学习更高级的 Websocket 功能。如果你有任何问题或建议,请在评论中给我们留言!