近年来,WebSocket技术已经成为了Web开发中不可或缺的一部分。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它使得客户端和服务器之间的通信更加流畅和高效。如今,很多现代的Web应用程序都使用了WebSocket技术,例如实时聊天、在线游戏以及实时数据可视化等。
Go语言作为一个现代的编程语言,自然也提供了很好的支持WebSocket技术的功能。在本文中,我们将深入探讨如何在Go中使用WebSocket技术。
WebSocket在Go语言中的实现
net/httpnet/httpgithub.com/gorilla/websocketgithub.com/gorilla/websocket创建WebSocket服务端
在Go语言中,创建WebSocket服务端的方式也比较简单。我们直接看下列代码,它展示了如何创建一个HTTP服务器,等待客户端的WebSocket连接:
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func main() {
http.HandleFunc("/ws", handleWebSocket)
http.ListenAndServe(":8080", nil)
}
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer conn.Close()
for {
messageType, message, err := conn.ReadMessage()
if err != nil {
log.Println(err)
return
}
log.Printf("Received message: %s
", message)
err = conn.WriteMessage(messageType, message)
if err != nil {
log.Println(err)
return
}
log.Printf("Sent message: %s
", message)
}
}websocket.UpgraderhandleWebSocketconn.ReadMessage()conn.WriteMessage()handleWebSocket/ws2021/10/13 15:20:06 http: Server started at http://127.0.0.1:8080
ws://localhost:8080/ws创建WebSocket客户端
与创建WebSocket服务端类似,我们也可以很容易地在Go语言中创建一个WebSocket客户端。我们来看下面的代码,它描述了如何创建一个与WebSocket服务器建立连接的客户端:
package main
import (
"fmt"
"log"
"net/url"
"os"
"os/signal"
"syscall"
"github.com/gorilla/websocket"
)
func main() {
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM)
u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
log.Printf("Connecting to %s", u.String())
conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
if err != nil {
log.Fatal("dial:", err)
}
defer conn.Close()
done := make(chan struct{})
go func() {
defer close(done)
for {
messageType, message, err := conn.ReadMessage()
if err != nil {
log.Println("read:", err)
return
}
log.Printf("Received message: %s
", message)
if err := conn.WriteMessage(messageType, message); err != nil {
log.Println("write:", err)
return
}
log.Printf("Sent message: %s
", message)
}
}()
for {
select {
case <-done:
return
case <-interrupt:
log.Println("interrupt")
if err := conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")); err != nil {
log.Println("write close:", err)
return
}
select {
case <-done:
case <-time.After(time.Second):
}
return
}
}
}websocket.Dialconn.ReadMessage()conn.WriteMessage()channelsinterruptwebsocket.CloseMessage结论
github.com/gorilla/websocket如果您对WebSocket技术以及如何在Go语言中使用它还有任何疑问或意见,欢迎在下面留言,与我们分享您的想法。