go聊天室
Go 聊天室
2023-09-14 09:12:09 时间
package main
import (
"fmt"
"net"
"sync"
)
var mux sync.RWMutex
var onlineUser = make(map[string]net.Conn)
var messageChan = make(chan string)
func main() {
listen, err := net.Listen("tcp", "127.0.0.1:8888")
if err != nil {
fmt.Printf("listen error %s\n", err)
}
defer listen.Close()
go listenBroadMessage()
for {
conn, err := listen.Accept()
if err != nil {
fmt.Printf("conn error %s \n", err)
}
go handlerConn(conn)
}
}
// listen broad message and send to all user
func listenBroadMessage() {
for {
msg := <-messageChan
fmt.Println("收到消息:" + msg)
for _, conn := range onlineUser {
conn.Write([]byte(msg))
}
}
}
//broadcast message
func broadMessage(conn net.Conn, message string) {
messageChan <- generateMessage(conn, message)
}
func generateMessage(conn net.Conn, msg string) string {
return "[" + conn.RemoteAddr().String() + "]" + " " + msg + "\n"
}
// handler each user
func handlerConn(conn net.Conn) {
addr := conn.RemoteAddr().String()
broadMessage(conn, "进入了房间")
mux.Lock()
onlineUser[addr] = conn
mux.Unlock()
var isQuit = make(chan bool)
go func() {
buff := make([]byte, 4098)
for {
n, _ := conn.Read(buff)
if n == 0 {
isQuit <- true
return
}
buffMsg := string(buff[:n-1])
if buffMsg != "" {
broadMessage(conn, buffMsg)
}
}
}()
for {
select {
case <-isQuit:
delete(onlineUser, addr)
broadMessage(conn, "离开了房间")
return
}
}
}
https://blog.csdn.net/weixin_42940826/article/details/82386275
相关文章
- Go语言中type的用法
- go语言实现分布式id生成器
- [Go] 子类 调用 父类 的 属性、方法
- 【Go命令教程】2. go build
- 《Go学习笔记 . 雨痕》方法
- Go 语言体系下的微服务框架选型: Dubbo-go
- go的websocket实现
- 【Go语言】【8】GO语言的条件语句和选择语句
- 【Go语言】【6】GO语言的数组
- 【Go语言】【4】GO语言类型和为类型增加方法
- go gin框架配置日志输出到文件
- [Go] go-nsq 使用指南
- [Go] go build 减小二进制文件大小的几种方式
- [Go] 注意 go build -o <output> 选项的准确含义
- Atitit go语言 golang 艾提拉总结特性优缺点 目录 1. Go 语言最主要的特性:1 2. 体积大概100M1 3. 问题1 3.1. 编译速度和异常控制怎么样1 3.2.
- 我的Go+语言初体验——go【Format】goplus
- 【Go基础】理解go语言变量
- 【Go】go实现 — 冒泡排序算法
- 【Go】go实现 — 选择排序
- 【Go】go实现 — 算法复杂度
- 【ubuntu】ubuntu下安装go语言SDK
- GO语言实现 自动登陆华为云并获取cookies 详解(兼介绍SSO单点登陆)
- Go语言自学系列 | golang包
- Go语言自学系列 | go语言中的流程控制
- Go语言自学系列 | go语言中的流程控制
- Go 变量定义 使用注意事项
- 初窥门径:一个Go程序的结构是怎样的?
- go 实现斐波那契数列
- Mac上搭建Go语言环境及第一个hello.go程序