多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> ### 聊天室(精简版) * 完整源代码 : 链接:[https://pan.baidu.com/s/1gq7-8cifyteFtsDhYa8W7A](https://pan.baidu.com/s/1gq7-8cifyteFtsDhYa8W7A)提取码:mtgv * 部署 : go build 生成可执行文件, 运行可执行文件。打开客户端 login*1.html 和 login*2.html 在文本框下进行聊天。 ~~~ package main import ( "fmt" //命令行窗口下 go get github.com/gorilla/websocket 下载第三方库 "github.com/gorilla/websocket" "net/http" ) var ch chan []byte var connList map[string]*websocket.Conn //客户端实例(高并发下会出现并发读或并发写错误,可以加锁或者用sync.map) //协议升级 var ConfigUpgrade = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } func chatHandler(w http.ResponseWriter, r *http.Request) { //conn:客户端连接实例 conn, err := ConfigUpgrade.Upgrade(w, r, nil) if err != nil { fmt.Println(err.Error()) delete(connList, conn.RemoteAddr().String()) return } connList[conn.RemoteAddr().String()] = conn //专门接收客户端的消息 for { _, message, err := conn.ReadMessage() if err != nil { //读取失败,删除客户端实例 if _, ok := connList[conn.RemoteAddr().String()]; ok { delete(connList, conn.RemoteAddr().String()) } fmt.Println(err.Error()) break } ch <- message } } func main() { ch = make(chan []byte, 4096) connList = make(map[string]*websocket.Conn) //开一个协程用于将某个客户端的消息发送到所有客户端去 go func() { for message := range ch { for k, v := range connList { if err := v.WriteMessage(1, message); err != nil { //写入失败,删除客户端实例 if _, ok := connList[k]; ok { delete(connList, k) } fmt.Println(err.Error()) continue } } } }() //启动Http服务,绑定监听8001端口 http.HandleFunc("/chat", chatHandler) if err := http.ListenAndServe(":8001", nil); err != nil { fmt.Println("服务启动失败", "Error", err.Error()) } } ~~~