3,423
社区成员
发帖
与我相关
我的任务
分享
package main
import (
"fmt"
"net"
"os"
)
type Client struct {
C chan string
Name string
Addr string
}
var Message = make(chan string)
var OnlineUser map[string]Client
func WriteMsgToClient(cli Client, conn net.Conn) {
fmt.Println("write to ", conn.RemoteAddr().String())
for msg := range cli.C {
conn.Write([]byte(msg + "\n"))
}
}
func MakeMsg(cli Client, msg string) (buf string) {
buf = "[" + cli.Addr + "]" + cli.Name + ":" + msg
return
}
func dealConn(conn net.Conn) {
defer conn.Close()
defer func() {
fmt.Println("start panic defer")
if r := recover(); r != nil {
fmt.Println("defer panic: ", r)
}
}()
//获取客户端网络地址
cliAddr := conn.RemoteAddr().String()
cli := Client{make(chan string), cliAddr, cliAddr}
OnlineUser[cliAddr] = cli
//新开一个协程专门给当前客户端发送消息
go WriteMsgToClient(cli, conn)
Message <- MakeMsg(cli, "login") /***貌似就卡在这个地方了,不知道啥原因***/
for {
}
}
func Manager() {
OnlineUser = make(map[string]Client)
for {
msg := <-Message
fmt.Println("msg = ", msg)
for _, cli := range OnlineUser {
cli.C <- msg
}
}
}
func main() {
listenfd, err := net.Listen("tcp", ":6666")
if err != nil {
fmt.Println("Error : %s", err.Error())
os.Exit(1)
}
defer listenfd.Close()
//新开一个协程,转发消息,有消息来就遍历map,给map每个成员转发此消息
go Manager()
for {
conn, err := listenfd.Accept()
if err != nil {
fmt.Println("listen.Accept err = ", err)
continue
}
fmt.Println(conn.RemoteAddr().String())
go dealConn(conn)
}
}