func (s *TcpServer) Exit() { s.eventDispatch.Close() s.stopChan <- false close(s.stopChan) elog.LogSys(" close new conn ch ") close(s.newConnCh) elog.LogSys(" end new conn ch ") elog.LogSys("wait...") s.waitGroup.Wait() elog.Flush() }
func defErrorCallback(conn *Connection) { if conn.IsConnected() { elog.LogSys(" read msg error, close socket ") conn.Close() } }
func (tcpClient *TcpClient) onRead(e IEvent) { ev := e.(*ConnReadEvent) //在这里加上用户消息处理时间 tcpClient.msgDispatcher.DispatchMsg(ev.conn, ev.id, ev.msg) elog.LogSys(" client read msg id :%d ", ev.id) }
func (s *TcpServer) onRead(e IEvent) { ev := e.(*ConnReadEvent) //在这里加上用户消息处理时间 s.msgDispatcher.DispatchMsg(ev.conn, ev.id, ev.msg) elog.LogSys(" server read msg id :%d ", ev.id) }
func (tcpClient *TcpClient) onClose(e IEvent) { ev := e.(*ConnCloseEvent) if tcpClient.closeCb != nil { tcpClient.closeCb(ev.conn) } elog.LogSys("cient close") }
func (tcpClient *TcpClient) Loop() { if !tcpClient.isConnection { elog.LogSys(" client not connevt server ") } tcpClient.eventDispatch.Loop() }
func (ed *EventDispatch) Close() { elog.LogSys("close event channel") for i := range ed.eventCh { close(ed.eventCh[i]) } }
func (md *MsgDispatcher) DispatchMsg(conn *Connection, id int32, msg proto.Message) { if id >= MSG_MAX { return } elog.LogSys(" dispatcher msg :%d ", id) cb := md.cbMap[id] if cb == nil { elog.LogSys(" dispatcher msg :%d not register cb ", id) return } cb(conn, msg) }
func (s *TcpServer) onClose(e IEvent) { ev := e.(*ConnCloseEvent) if s.closeCb != nil { s.closeCb(ev.conn) } s.DelConn(ev.conn) elog.LogSys("cient close") }
func (tcpClient *TcpClient) Close() { tcpClient.eventDispatch.Close() elog.LogSys(" close conn ") tcpClient.conn.Close() tcpClient.waitGroup.Wait() //关闭连接 elog.Flush() }
func (s *TcpServer) Loop() { if s.isListen == false { elog.LogSys(" not listen, please first listen ") return } s.eventDispatch.Loop() }
func (a *Acceptor) loop(ch chan *Connection) { elog.LogSys(" acceptor is begin ") a.waitGroup.Add(1) defer a.waitGroup.Done() for { select { case <-a.stopChan: elog.LogSys(" recv stop chan ,stop Accept ") a.listener.Close() return default: } a.listener.SetDeadline(time.Now().Add(1e9)) conn, err := a.listener.AcceptTCP() if err != nil { if opErr, ok := err.(*net.OpError); ok && opErr.Timeout() { continue } elog.LogSysln(" accetp fail :", err) break } elog.LogSys("receive new conn") //newConn ,err := NewConn( conn, a.eventDispatch, a.waitGroup ) a.eventDispatch.AddNewConnEvent(conn) } elog.LogSys(" acceptor is end ") }
func (e *EventDispatch) FreeEvent(ev IEvent) { et := ev.GetEventType() e.eventMu[et].Lock() ne := ev.Next() // make compliler happy if ne != nil { return } ne = e.eventList[et] e.eventList[et] = ev e.eventMu[et].Unlock() elog.LogSys(" free event type : %d", ev.GetEventType()) }
func main() { elog.InitLog(elog.INFO) server := NewEsServer() ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM) server.Init() server.Run() fmt.Println(<-ch) server.tcpServer.Exit() elog.LogSys("Hhhhhh") }
func (s *TcpServer) onConn(e IEvent) { ev := e.(*ConnNewEvent) //控制数量 if len(s.connMap) >= s.maxConn { ev.conn.Close() return } conn, _ := NewConn(ev.conn, s.eventDispatch, s.waitGroup) //设置消息解析器 conn.setMsgParse(s.msgParse) //回调用户 if s.connCb != nil { s.connCb(conn) } //hi, go conn.SetConnStatus(CONNECTED) conn.SetConnId(atomic.AddUint64(&s.maxConnId, 1)) s.AddConn(conn) go conn.handleEvent() elog.LogSys("receive conn id: %s , total : %d", conn.connId, len(s.connMap)) }
func (lmp *LiteMsgParse) parse(conn *Connection) (id int32, errNo int, msg proto.Message) { var len int32 //Fixme add little big endian cfg err := binary.Read(&conn.recvBuf, binary.LittleEndian, &len) if err != nil { elog.LogSysln("read msg len err : ", err) errNo = c_ErrLen return } elog.LogSysln(" parse msg len : ", len) if len > c_MaxMsgLen || len < c_HeaderLen { elog.LogSysln(" msg len is err : ") errNo = c_ErrLen return } if conn.recvBuf.Size() >= int(len-c_HeaderLen) { err = binary.Read(&conn.recvBuf, binary.LittleEndian, &id) if err != nil || id >= MSG_MAX { elog.LogSysln("read msg id err : ", err) errNo = c_ErrMsgId return } elog.LogSysln(" parsr msg id : ", id) /*info := GetMsgDispatcher().GetMsgInfo( int(id) ) if info == nil { elog.LogSys("not register msg is : %d", id ) return c_ErrMsgId }*/ // msg may be nil if (len - c_HeaderLen) > 0 { b := make([]byte, len-c_HeaderLen) err = binary.Read(&conn.recvBuf, binary.LittleEndian, &b) if err != nil { elog.LogSys("read msg body fail ", id) errNo = c_ParseErr return } msg = lmp.msgFactory.createMsgById(id) elog.LogSysln(" create msg type ", reflect.TypeOf(msg)) err = proto.Unmarshal(b, msg) if err != nil { elog.LogSys(" protobuf parse msg body fail ", err) errNo = c_ParseErr return } errNo = c_NoError return } } elog.LogSysln(" recv msg len is big than buffer ") errNo = c_NeedContinue id = 0 return }
func (ed *EventDispatch) pushEvent(ev IEvent) { elog.LogSys("push %d event to event channel ", ev.GetEventType()) ed.eventCh[ev.GetEventType()] <- ev }