近年来,WebSocket技术已经成为了Web开发中不可或缺的一部分。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它使得客户端和服务器之间的通信更加流畅和高效。如今,很多现代的Web应用程序都使用了WebSocket技术,例如实时聊天、在线游戏以及实时数据可视化等。
Go语言作为一个现代的编程语言,自然也提供了很好的支持WebSocket技术的功能。在本文中,我们将深入探讨如何在Go中使用WebSocket技术。
WebSocket在Go语言中的实现
net/httpnet/httpgithub.com/gorilla/websocket
github.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/ws
2021/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语言中使用它还有任何疑问或意见,欢迎在下面留言,与我们分享您的想法。