Skip to content

0726扒客户端原代码(1)

ziyouzy edited this page Jul 26, 2020 · 1 revision

client.process.userProcess.go中的重要UserProcess结构体有两个重要的方法:Register和Login

相同点是都用到了conn, err := net.Dial("tcp", "localhost:8889")

不同点是Login设计了状态保持(go serverProcessMes(conn)),Register则没有

Register很类似restapi的一过性调用,注册结束后,函数结束的同时Conn实体就销毁了

而Login则不同,函数自身虽然也会销毁(但却没有,后边有个for循环阻塞住了),同时也将Conn传入了线程函数go serverProcessMes(conn)中,于是就算最后他自身销毁了,Conn也依然存在

go serverProcessMes(conn)和后面的ShowMenu()是两个同样重要且功能稍有复杂的函数,其都存在于process.server.go中,按照顺序,先分析前者:

tf := &utils.Transfer{
	Conn: conn,
}
for {
	fmt.Println("客户端正在等待读取服务器发送的消息")
	mes, err := tf.ReadPkg()
	if err != nil {
		fmt.Println("tf.ReadPkg err=", err)
		return 
	}
    }

可以看出他起到了监听Conn是否有内容可读的功能,也正因为此,他会将serverProcessMes自身阻塞

for循环内存在这一switch:

    switch mes.Type {
	
		case message.NotifyUserStatusMesType : // 有人上线了

			//1. 取出.NotifyUserStatusMes
			var notifyUserStatusMes message.NotifyUserStatusMes
			json.Unmarshal([]byte(mes.Data), &notifyUserStatusMes)
			//2. 把这个用户的信息,状态保存到客户map[int]User中
			updateUserStatus(&notifyUserStatusMes)
			//处理
		case message.SmsMesType : //有人群发消息
			outputGroupMes(&mes)
		default :
			fmt.Println("服务器端返回了未知的消息类型")
}

从而实现当有数据可读时,进行响应的操作于处理。

serverProcessMes是各种关于读取Conn的操作,而ShowMenu则正好相反,开启的都是向Conn写入数据的相关操作

这里开一篇新文章,理清关于套接字“读写分离”的思路

Clone this wiki locally