本来打算练习go websocket 做一个示例,结果在网上找了一个聊天室的示例【Go websocket 聊天室的详细实现和详细分析_上官二狗的博客-CSDN博客_go websocket 聊天室】,感觉不错就拿来用一下。
介绍
首先需要有一个客户端 client 的 manager ,manager 里应该保存所有的client 信息
所以在我们的程序里定义了 ClientManager 这个结构体
用 clients 这个 map 结构来保存所有的连接信息
遍历 clients 通过使用 broadcast 这个 channel 把 web 端传送来的消息分发给所有的客户端client
其次每个成功建立长连接的 client 开一个 read 协程和 wrtie 协程
read 协程不断读取 web 端输入的 meaasge,并把 message 传递给 boradcast ,让 manager 遍历 clients 把 message 通过 broadcast channel ,传递给各个客户端 client 的 send channel
write 协程不断的将 send channel 里的消息发送给 web 端
结构图大致如下:
服务代码
main.go
package main
import (
"encoding/json"
"fmt"
"net"
"net/http"
"github.com/gorilla/websocket"
uuid "github.com/satori/go.uuid"
)
//客户端管理
type ClientManager struct {
//客户端 map 储存并管理所有的长连接client,在线的为true,不在的为false
clients map[*Client]bool
//web端发送来的的message我们用broadcast来接收,并最后分发给所有的client
broadcast chan []byte
//新创建的长连接client
register chan *Client
//新注销的长连接client
unregister chan *Client
}
//客户端 Client
type Client struct {
//用户id
id string
//连接的socket
socket *websocket.Conn
//发送的消息
send chan []byte
}
//会把Message格式化成json
type Message struct {
//消息struct
Sender string `json:"sender,omitempty"` //发送者
Recipient string `json:"recipient,omitempty"` //接收者
Content string `json:"content,omitempty"` //内容
ServerIP string `json:"serverIp,omitempty"` //实际不需要 验证k8s
SenderIP string `json:"senderIp,omitempty"` //实际不需要 验证k8s
}
//创建客户端管理者
var manager = ClientManager{
broadcast: make(chan []byte),
register: make(chan *Client),
unregister: make(chan *Client),
clients: make(map[*Client]bool),
}
func (manager *ClientManager) start() {
for {
select {
//如果有新的连接接入,就通过channel把连接传递给conn
case conn := <-manager.register:
//把客户端的连接设置为true
manager.clients[conn] = true
//把返回连接成功的消息json格式化
jsonMessage, _ := jso