新聞中心
go get golang.org/x/net/websocket。 WebSocket在Golang中的應(yīng)用實(shí)踐

WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,它使得瀏覽器和服務(wù)器之間可以實(shí)現(xiàn)實(shí)時(shí)雙向通信,從而提高了用戶體驗(yàn),在Golang中,我們可以使用gorilla/websocket庫(kù)來(lái)實(shí)現(xiàn)WebSocket服務(wù)器和客戶端的功能,本文將介紹如何在Golang中使用WebSocket進(jìn)行實(shí)時(shí)通信,并提供一些實(shí)踐案例。
安裝gorilla/websocket庫(kù)
我們需要安裝gorilla/websocket庫(kù),在終端中輸入以下命令:
go get github.com/gorilla/websocket
創(chuàng)建WebSocket服務(wù)器
1、導(dǎo)入相關(guān)包:
import ( "fmt" "net/http" "github.com/gorilla/websocket" )
2、定義處理WebSocket連接的函數(shù):
func handleConnections(w http.ResponseWriter, r *http.Request) {
// 將HTTP連接升級(jí)為WebSocket連接
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Println("Error upgrading connection:", err)
return
}
defer ws.Close()
for {
// 讀取客戶端發(fā)送的消息
_, 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、在主函數(shù)中啟動(dòng)HTTP服務(wù)器并監(jiān)聽(tīng)WebSocket連接:
func main() {
http.HandleFunc("/ws", handleConnections)
http.ListenAndServe(":8080", nil)
}
至此,我們已經(jīng)創(chuàng)建了一個(gè)簡(jiǎn)單的WebSocket服務(wù)器,客戶端可以通過(guò)訪問(wèn)ws://localhost:8080/ws與服務(wù)器建立連接并進(jìn)行實(shí)時(shí)通信。
創(chuàng)建WebSocket客戶端
1、我們需要導(dǎo)入相關(guān)包:
import ( "fmt" "log" "os" "time" "github.com/gorilla/websocket" )
2、我們可以編寫(xiě)一個(gè)簡(jiǎn)單的WebSocket客戶端,用于與服務(wù)器進(jìn)行通信:
func main() {
// 建立WebSocket連接到服務(wù)器
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秒向服務(wù)器發(fā)送一條消息,并接收一條回復(fù)消息打印出來(lái)
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() // 這里會(huì)阻塞等待服務(wù)器的回復(fù)消息,所以需要放在goroutine中執(zhí)行以避免阻塞主線程,如果不需要阻塞等待,可以直接調(diào)用conn.ReadMessage(),err為nil表示收到了回復(fù)消息,如果err非nil,表示連接已關(guān)閉或發(fā)生錯(cuò)誤,msg即為收到的回復(fù)消息。 fmt.Printf("Received message: %s
", msg) }()
分享標(biāo)題:golangwebsocket
路徑分享:http://fisionsoft.com.cn/article/dpdehhi.html


咨詢
建站咨詢
