多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
~~~ package main import ( "net" "fmt" "runtime" ) func main() { //TODO : 绑定端口和监听端口 listen, err := net.Listen("tcp", ":9001") if err != nil { fmt.Println(err) } list := make(map[net.Conn]net.Conn, 100) ch := make(chan []byte, 1000) //TODO : 阻塞直到有客户端连接 go func() { for { conn, err := listen.Accept() if err != nil { _, file, line, _ := runtime.Caller(0) fmt.Println(file, line, err) break } list[conn] = conn //TODO : 接收客户端发送的消息 go func() { for { //(头信息+最大允许输入字数)*3 buf := make([]byte, 1024) n, err := conn.Read(buf) if err != nil { delete(list, conn) conn.Close() _, file, line, _ := runtime.Caller(0) fmt.Println(file, line, err) break } ch <- buf[:n] } }() //<--接收客户端发送的消息--> /* //TODO : 接收客户端发送的消息 go func() { var bb [4096]byte var content []byte for { n, err := conn.Read(bb[:]) if err != nil { delete(list, conn) conn.Close() _, file, line, _ := runtime.Caller(0) fmt.Println(file, line, err) break } content = append(content, bb[:n]...) if n < 4096 { ch <- content content = []byte{} } } }() //<--接收客户端发送的消息--> */ } }() //<--阻塞直到有客户端连接--> //TODO : 向客户端发送消息 for { select { case content := <-ch: for _, v := range list { v.Write(content) } } } //<--向客户端发送消息--> } ~~~