golang Gorilla 服务器发送消息给指定的客户端
在Gorilla服务器中,可以通过WebSocket连接发送消息给指定的客户端。下面是一个简单的例子:
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer conn.Close()
// 读取客户端发送的消息
for {
_, message, err := conn.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}
log.Printf("recv: %s", message)
// 发送消息给指定的客户端
err = conn.WriteMessage(websocket.TextMessage, []byte("Hello, client!"))
if err != nil {
log.Println("write:", err)
break
}
}
}
在上面的例子中,当客户端连接到服务器时,服务器会将连接升级为WebSocket连接。然后,服务器将等待客户端发送消息。当服务器收到消息时,它将发送一条消息给客户端。
要将消息发送给指定的客户端,您需要在服务器端维护一个客户端列表。当服务器收到消息时,它可以遍历此列表,并将消息发送给指定的客户端。这里是一个示例:
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
// 客户端结构体
type Client struct {
conn *websocket.Conn
}
// 客户端列表
var clients = make(map[*Client]bool)
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer conn.Close()
// 创建新的客户端
client := &Client{conn}
// 将客户端添加到列表中
clients[client] = true
// 读取客户端发送的消息
for {
_, message, err := conn.ReadMessage()
if err != nil {
log.Println("read:", err)
// 从列表中删除客户端
delete(clients, client)
break
}
log.Printf("recv: %s", message)
// 发送消息给所有客户端
for c := range clients {
if c != client {
err = c.conn.WriteMessage(websocket.TextMessage, []byte("Hello, client!"))
if err != nil {
log.Println("write:", err)
break
}
}
}
}
}
在上面的例子中,当客户端连接到服务器时,服务器会将连接升级为WebSocket连接。然后,服务器将创建一个新的客户端,并将其添加到客户端列表中。当服务器收到消息时,它会遍历客户端列表,并将消息发送给除发送方外的所有客户端。如果客户端关闭连接,服务器将从客户端列表中删除该客户端。
原文地址: https://www.cveoy.top/t/topic/siO 著作权归作者所有。请勿转载和采集!