//发送循环 func (r *Robot) SendLoop() { defer r.Close() elog.LogDebug(" robot %d send loop run ", r.id) for { select { case msg := <-r.sendCh: //从发送通道取出待发送消息 elog.LogInfo(" encode msg :%d ", msg.id) binary.Write(r.sendBuf, binary.LittleEndian, msg.id) //写ID binary.Write(r.sendBuf, binary.LittleEndian, msg.Data) //写数据 byte := r.sendBuf.Bytes() n, err := r.tcpConn.Write(byte) if err != nil { elog.LogSysln(" conn ", r.id, " write data fail :", err) return } elog.LogInfo(" write msg :%d ", n, hex.Dump(r.sendBuf.Bytes())) case <-r.closeCh: //机器人关闭信号 elog.LogDebug(" send loop begin close ") return } } elog.LogDebug("send loop close ") }
//关闭机器人 func (r *Robot) Close() { if atomic.CompareAndSwapUint32(&r.state, kRobotActive, kRobotClose) { //如果状态为active,则返回true,并且设置状态为close r.delCh <- r.id //这里告诉机器人管理器删除机器人 close(r.closeCh) //通知关闭机器人 elog.LogInfo(" robot:%d close ", r.id) r.ticker.Stop() //关闭时钟 r.tcpConn.Close() //关闭连接 } }
//接收消息 func (r *Robot) RecvMsg() (msg Message, err error) { select { case msg = <-r.recvCh: //从接收通道取出待接收消息 elog.LogInfo("receieve msg :%s ", msg.id) err = nil return default: } err = errors.New(" not msg ") return }
func main() { elog.InitLog(elog.INFO) elog.LogInfo(" --------------------- let go ------------------------") robotMng := robot.NewRobotMng() //创建机器人管理器 robotMng.SetUpdateCb(process) //设置更新回调 robotMng.Run() //启动机器人管理器 //系统退出信号处理 ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM) <-ch robotMng.Close() //关闭机器人管理器 }
//发送消息 func (r *Robot) SendMsg(msg Message) { r.sendCh <- msg //发送到通道 elog.LogInfo(" send msg : ", msg.id) }