读写分离
-
添加一个Reader和Writer之间的通信channel
-
添加一个Writer Goroutine
阻塞等待channel是否有需要的数据过来
将数据回写给conn对应的客户端
-
Reader由之前的
-
同时启动Writer和Reader的Goroutine
-
处理Writer退出,当触发c.Stop()告知Writer退出
修改
Connection模块
结构体
//添加一个 Reader和Writer通信的Channel msgChan chan []byte //创建一个Channel 用来Reader通知Writer conn已经关闭,需要退出的消息 writerExitChan chan bool
构造函数
//新增 msgChan:make(chan []byte), writerExitChan:make(chan bool),
新增方法
//写消息的Goroutine 专门负责给客户端发送消息 func (c *Connection) StartWriter() { fmt.Println("[Writer Goroutine is Started]...") defer fmt.Println("Writer Goroutine Stop...") //IO多路复用 for { select { case data := <-c.msgChan: if _, err := c.conn.Write(data); err != nil { fmt.Println("Send data error", err) return } case <- c.writerExitChan: //代表reader已经退出了,writer也要退出 return } } }
修改方法
func (c *Connection) Send(msgId uint32, msgData []byte) error { //新增 //将要发送的打包好的二进制数发送channel 让writer去写 c.msgChan <- binaryMsg }
func (c *Connection)Stop() { //新增 //通知Writer结束 c.writerExitChan <- true }