以下是一个简单的Go语言实现的websocket服务器和两个连接到该服务器的websocket客户端的示例代码。
服务器端代码 (server.go
):
package main
import (
"fmt"
"net/url"
"os"
"github.com/gorilla/websocket"
)
var socket = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true // 允许跨域请求
},
}
func echo(w http.ResponseWriter, r *http.Request) {
conn, _, err := socket.Upgrade(w, r, nil)
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
for {
messageType, p, err := conn.ReadMessage()
if err != nil {
fmt.Println(err)
return
}
err = conn.WriteMessage(messageType, p)
if err != nil {
fmt.Println(err)
return
}
}
}
func main() {
http.HandleFunc("/echo", echo)
fmt.Println("Starting server on :8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
fmt.Println("ListenAndServe:", err)
os.Exit(1)
}
}
客户端A代码 (clientA.go
):
package main
import (
"fmt"
"log"
"net/url"
"os"
"github.com/gorilla/websocket"
)
var socket = websocket.Dialer{
Subprotocols: []string{"p1", "p2"},
HandshakeTimeout: 4500 * time.Millisecond,
}
func main() {
u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/echo"}
conn, _, err := socket.Dial(u.String(), nil)
if err != nil {
log.Fatal("dial:", err)
}
defer conn.Close()
done := make(chan struct{})
go func() {
defer close(done)
for {
_, message, err := conn.ReadMessage()
if err != nil {
log.Println("read:", err)
return
}
fmt.Println("recv:", string(message))
}
}()
for {
message := "Hello, Client A!"
err = conn.WriteMessage(websocket.TextMessage, []byte(message))
if err != nil {
log.Println("write:", err)
return
}
fmt.Println("send:", message)
}
}
客户端B的代码类似于客户端A,只是连接到服务器的路径不同,并且在发送和接收消息时,消息内容会有所区别。
确保先运行服务器 (go run server.go
),然后分别运行客户端A和客户端B (go run clientA.go
)。
这个简单的例子展示了如何使用gorilla/websocket包在Go中实现一个基本的websocket服务器和两个连接到该服务器的客户端。服务器端使用Upgrader
来升级HTTP连接到websocket连接,并在新的websocket连接上进入循环,不断地读取消息并回送。客户端代码使用Dialer
来连接到服务器并发送消息,同时接收并打印服务器