Zinx_V0.7 读写分离

读写分离
  1. 添加一个Reader和Writer之间的通信channel

  2. 添加一个Writer Goroutine

    阻塞等待channel是否有需要的数据过来

    将数据回写给conn对应的客户端

  3. Reader由之前的

  4. 同时启动Writer和Reader的Goroutine

  5. 处理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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值