Zinx

    xiaoxiao2025-04-24  22

    读写分离

    添加一个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 }
    最新回复(0)