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 功能。如果你有任何问题或建议,请在评论中给我们留言!