ZBLOG

go webscoket

下面是一个简单的示例,展示如何使用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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=17143

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?