创建客户端
先在main方法中创建一个sorcket服务端,这个服务端就像一个酒店
func main() {
listen, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("listen err", err)
return
}
defer listen.Close()
}
监听呼叫
之后就要开始监听下一个客户端的呼叫,也就是等待下一位客人
Accept方法会等待下一个呼叫,并返回一个该呼叫的Conn接口。这时便拿到了客人的信息
func main() {
// 创建服务端
listen, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("listen err", err)
return
}
defer listen.Close()
// 等待客户端呼叫
for {
conn, err := listen.Accept()
if err != nil {
fmt.Println("accept err", err)
return
}
}
}
创建客户端
创建客户端结构体, 每个服务端是一个用户
type Client struct{
c chan string // 消息接受管道
Name string // 昵称
Addr string // ip与端口
}
收到呼叫拿到conn后,就需要为这个conn来创建一个协程
也就是得到客人的信息后,专门派一个服务员只为该客户服务
func main() {
// 创建服务端
listen, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("listen err", err)
return
}
defer listen.Close()
go Manager() // 这个暂时忽略掉,下面有
// 等待客户端呼叫
for {
conn, err := listen.Accept()
if err != nil {
fmt.Println("accept err", err)
return
}
go HandleConnect(conn) // 这里加了一句代码,启动一个go协程来为conn服务
}
}
服务员要干的第一件是就是带客户到房间,也就是为这个conn创建一个Client,并将其放进在线用户Map,netAddr是网络地址,以网络地址为键,client为值
全局变量 在线用户map
var onlineUsersMap map[string]*Client
到这里就出现问题了,那在线用户map在哪里初始化使用啊?
我们创建一个专门来管理在线用户与消息群发的管理方法,这里暂时先初始化在线用户
func Manager(){
// 初始化一下在线用户map
onlineUsersMap = make(map[string]*Client)
}
初始化一定要在赋值前,因此Manager协程一定要在HandleConnect前启动,现在翻到上面的main方法中,看一下位置
func HandleConnect(conn net.Conn