下面是一个简单的示例,展示如何使用Go语言编写一个基于WebSocket的服务器和客户端。
服务端代码(server.go):
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var clients = make(map[*websocket.Conn]bool) // 存储所有连接的客户端
var broadcast = make(chan Message) // 广播通道
// 定义消息结构体
type Message struct {
Username string `json:"username"`
Message string `json:"message"`
}
func main() {
http.HandleFunc("/ws", handleWebSocket)
go startBroadcast()
log.Println("Server is running on http://localhost:8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
upgrader := websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true },
}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Upgrade error:", err)
return
}
defer conn.Close()
log.Println("New client connected")
clients[conn] = true
for {
var message Message
err := conn.ReadJSON(&message)
if err != nil {
log.Printf("ReadJSON error: %v\n", err)
delete(clients, conn)
break
}
log.Printf("Received message from %s: %s\n", message.Username, message.Message)
broadcast <- message
}
}
func startBroadcast() {
for {
message := <-broadcast
log.Printf("Broadcasting message from %s: %s\n", message.Username, message.Message)
for client := range clients {
err := client.WriteJSON(message)
if err != nil {
log.Printf("WriteJSON error: %v\n", err)
client.Close()
delete(clients, client)
}
}
}
}
客户端代码(client.go):
package main
import (
"bufio"
"fmt"
"log"
"net/url"
"os"
"github.com/gorilla/websocket"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter your username: ")
username, _ := reader.ReadString('\n')
u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
log.Printf("Connecting to server %s...", u.String())
conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
if err != nil {
log.Fatal("Dial error:", err)
}
defer conn.Close()
go receiveMessages(conn)
for {
fmt.Print("Enter message (or 'exit' to quit): ")
message, _ := reader.ReadString('\n')
if message == "exit\n" {
break
}
err = conn.WriteJSON(Message{
Username: username,
Message: message,
})
if err != nil {
log.Printf("WriteJSON error: %v\n", err)
break
}
}
log.Println("Disconnected from server")
}
func receiveMessages(conn *websocket.Conn) {
for {
var message Message
err := conn.ReadJSON(&message)
if err != nil {
log.Printf("ReadJSON error: %v\n", err)
break
}
log.Printf("[%s] %s\n", message.Username, message.Message)
}
}
以上示例使用了gorilla/websocket库来处理WebSocket连接和消息传递。在运行代码之前,请确保已经安装了该依赖项(可以通过 go get github.com/gorilla/websocket
命令进行安装)。
你可以根据需要修改服务器和客户端代码,并进一步扩展它们以满足你的需求。
内容由零声教学AI助手提供,问题来源于学员提问