添加一个Reader和Writer之间的通信channel
添加一个Writer Goroutine
阻塞等待channel是否有需要的数据过来
将数据回写给conn对应的客户端
Reader由之前的
同时启动Writer和Reader的Goroutine
处理Writer退出,当触发c.Stop()告知Writer退出
构造函数
//新增 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 }