上一篇
golang web socket
- 行业动态
- 2024-01-17
- 1
WebSocket是一种在单个TCP连接上进行全双工通信的协议。其最大特点之一就是:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。Go语言标准包里面没有提供对WebSocket的支持,但是在由官方维护的go.net子包中有对这个的支持。您可以通过如下的命令获取该包:
安装
go get golang.org/x/net/websocket
。
WebSocket在Golang中的应用实践
WebSocket是一种在单个TCP连接上进行全双工通信的协议,它使得浏览器和服务器之间可以实现实时双向通信,从而提高了用户体验,在Golang中,我们可以使用gorilla/websocket
库来实现WebSocket服务器和客户端的功能,本文将介绍如何在Golang中使用WebSocket进行实时通信,并提供一些实践案例。
安装gorilla/websocket
库
我们需要安装gorilla/websocket
库,在终端中输入以下命令:
go get github.com/gorilla/websocket
创建WebSocket服务器
1、导入相关包:
import ( "fmt" "net/http" "github.com/gorilla/websocket" )
2、定义处理WebSocket连接的函数:
func handleConnections(w http.ResponseWriter, r *http.Request) { // 将HTTP连接升级为WebSocket连接 ws, err := upgrader.Upgrade(w, r, nil) if err != nil { fmt.Println("Error upgrading connection:", err) return } defer ws.Close() for { // 读取客户端发送的消息 _, message, err := ws.ReadMessage() if err != nil { fmt.Println("Error reading message:", err) break } fmt.Printf("Received message: %s ", message) // 将收到的消息原样返回给客户端 err = ws.WriteMessage(websocket.TextMessage, message) if err != nil { fmt.Println("Error writing message:", err) break } } }
3、在主函数中启动HTTP服务器并监听WebSocket连接:
func main() { http.HandleFunc("/ws", handleConnections) http.ListenAndServe(":8080", nil) }
至此,我们已经创建了一个简单的WebSocket服务器,客户端可以通过访问ws://localhost:8080/ws
与服务器建立连接并进行实时通信。
创建WebSocket客户端
1、我们需要导入相关包:
import ( "fmt" "log" "os" "time" "github.com/gorilla/websocket" )
2、我们可以编写一个简单的WebSocket客户端,用于与服务器进行通信:
func main() { // 建立WebSocket连接到服务器 conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil) if err != nil { log.Fatal("Error connecting to server:", err) } defer conn.Close() defer os.Exit(0) // 每隔5秒向服务器发送一条消息,并接收一条回复消息打印出来 for i := 0; i < 5; i++ { go func() { time.Sleep(5 * time.Second); conn.WriteMessage(websocket.TextMessage, []byte("Hello from client")) }() msgType, msg, err := conn.ReadMessage() // 这里会阻塞等待服务器的回复消息,所以需要放在goroutine中执行以避免阻塞主线程,如果不需要阻塞等待,可以直接调用conn.ReadMessage(),err为nil表示收到了回复消息,如果err非nil,表示连接已关闭或发生错误,msg即为收到的回复消息。 fmt.Printf("Received message: %s ", msg) }()
本站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本站,有问题联系侵删!
本文链接:http://www.xixizhuji.com/fuzhu/213902.html