下载包
go get nhooyr.io/websocket
server端
package main
import (
"context"
"fmt"
"log"
"net/http"
"nhooyr.io/websocket"
"nhooyr.io/websocket/wsjson"
"time"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintln(w, "HTTP, Hello")
})
http.HandleFunc("/ws", func(w http.ResponseWriter, req *http.Request) {
conn, err := websocket.Accept(w, req, nil)
if err != nil {
log.Println(err)
return
}
defer conn.Close(websocket.StatusInternalError, "内部出错了")
ctx, cancel := context.WithTimeout(req.Context(), time.Second*10)
defer cancel()
var v interface{}
err = wsjson.Read(ctx, conn, &v)
if err != nil {
log.Println(err)
return
}
log.Printf("接收到客户端: %v\n", v)
err = wsjson.Write(ctx, conn, "Hello WebSocket Client")
if err != nil {
log.Println(err)
return
}
conn.Close(websocket.StatusNormalClosure, "")
})
log.Fatal(http.ListenAndServe(":2021", nil))
}
client端
package main
import (
"context"
"fmt"
"nhooyr.io/websocket"
"nhooyr.io/websocket/wsjson"
"time"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
conn, _, err := websocket.Dial(ctx, "ws://localhost:2021/ws", nil)
if err != nil {
panic(err)
}
defer conn.Close(websocket.StatusInternalError, "内部错误")
err = wsjson.Write(ctx, conn, "Hello WebSocker Server")
if err != nil {
panic(err)
}
var v interface{}
err = wsjson.Read(ctx, conn, &v)
if err != nil {
panic(err)
}
fmt.Printf("接收到服务端相应: %v\n", v)
conn.Close(websocket.StatusNormalClosure, "")
}
测试
启动服务端
go run server.go
启动客户端
go run client.go
看到消息,测试成功。