func (self *binaryAcceptor) Start() { ln, err := net.Listen("tcp", self.Address) if err != nil { log.Printf("error listen %s", err.Error()) return } // Accept线程 go func() { for { conn, err := ln.Accept() if err != nil { continue } // 启动session线程 go func() { ses := netdef.NewSession() ses.Codec = self.Codec ses.PStream = NewPacketStream(conn, self.GetSocketReadTimeout(), self.GetSocketWriteTimeout()) self.addSession(ses) ses.OnInternalStop = func(e error) { ses.EventChan <- true self.removeSession(ses) } // 启动派发线程(逻辑线程) go self.DispatchLoop(ses) // 启动发送线程 go self.SendPacketLoop(ses) // 心跳 go self.SessionEventLoop(ses) // 启动接收线程 go netfw.RecvPacketLoop(ses) // 投递接受的消息 ses.PostEvent(&netdef.NetEvent{Method: netdef.EventAccepted, Ses: ses, Tag: self}) }() } }() self.Ready = true }
func (self *binaryConnector) connect() { var errReported bool // 建立连接循环 for { err := self.createSession() if err != nil { // 错误只报一次 if !errReported { log.Printf(err.Error()) errReported = true } } else { // 连上了 break } // 没有重连设置, 退出 if !self.Define.GetAutoReconnect() { break } // 等待一段时间后再试 time.Sleep((time.Duration)(self.Define.GetFailedWaitSec()) * time.Second) } if self.Ready { ses := self.Session ses.OnInternalStop = func(e error) { self.Ready = false log.Printf("[%s] lost connection", self.ID) // 断开连接时, 如果有自动重连设置, 连接 if self.Define.GetAutoReconnect() { // 等待1秒后, 开始重连 time.AfterFunc(time.Second, func() { go self.connect() }) } } // 启动派发线程(逻辑线程) go self.DispatchLoop(ses) // 启动发送线程 go self.SendPacketLoop(ses) // 投递连接事件 ses.PostEvent(&netdef.NetEvent{Method: netdef.EventConnected, Ses: ses, Tag: self}) // 启动接收线程 go netfw.RecvPacketLoop(ses) } }