Пример #1
0
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

}
Пример #2
0
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)

	}
}