cellnet 是一个组件化、高扩展性、高性能的开源服务器网络库。它的次要概念如下
队列
队列应用 NewEventQueue 创立,应用.StartLoop()开启队列事件处理循环,所有投递到队列中的函数回调会在队列自在的 goroutine 中被调用,逻辑在此时被解决
个别在 main goroutine 中调用 queue.Wait 阻塞期待队列完结。
队列在 cellnet 中应用 cellnet.Queue 接口, 底层由带缓冲的 channel 实现
端(Peer)
peer 是客户端和服务端的封装
cellnet 应用 Acceptor 接管多个连贯,Acceptor 是一种 Peer(端),连贯到 Acceptor 的 Peer 叫做 Connector。
一个 Peer 领有很多属性(名称,地址,队列),peer.NewGenericPeer 函数封装了属性的设置过程。
peer.NewGenericPeer 创立好的 Peer 不会产生任何 socket 操作,对于 Acceptor 来说,调用 Acceptor 的 Start 办法后,才会真正开始 socket 的侦听
应用如下代码创立一个接受器(Acceptor):
queue := cellnet.NewEventQueue()
// NewGenericPeer 参数顺次是: peer 类型, peer 名称(日志中不便查看), 侦听地址,事件队列
peerIns := peer.NewGenericPeer("tcp.Acceptor", "server", "127.0.0.1:8801", queue)
peerIns.Start()
Connector 也是一种 Peer,与 Acceptor 很很多相似的中央,因而创立过程也是相似的。
应用如下代码创立一个连接器(Connector):
queue := cellnet.NewEventQueue()
peerIns := peer.NewGenericPeer("tcp.Connector", "client", "127.0.0.1:8801", queue)
peerIns.Start("127.0.0.1:8801")
处理器(proc)
cellnet 应用 Processor 解决音讯的收发过程。
应用 proc.BindProcessorHandler 函数,将一个 Peer 绑定到某个 Processor 上,且设置用户音讯解决回调。
上面代码尝试将 peerIns 的 Peer,绑定 ”tcp.ltv” 处理器,回调函数为 func(ev cellnet.Event) {…}
proc.BindProcessorHandler(peerIns, "tcp.ltv", func(ev cellnet.Event) {switch msg := ev.Message().(type) {
// 有新的连贯连到 8801 端口
case *cellnet.SessionAccepted:
log.Debugln("server accepted")
// 有连贯从 8801 端口断开
case *cellnet.SessionClosed:
log.Debugln("session closed:", ev.Session().ID())
// 收到某个连贯的 ChatREQ 音讯
case *proto.ChatREQ:
// 筹备回应的音讯
ack := proto.ChatACK{
Content: msg.Content, // 聊天内容
Id: ev.Session().ID(), // 应用会话 ID 作为发送内容的 ID
}
// 在 Peer 上查问 SessionAccessor 接口,并遍历 Peer 上的所有连贯,并发送回应音讯(即播送音讯)p.(cellnet.SessionAccessor).VisitSession(func(ses cellnet.Session) bool {ses.Send(&ack)
return true
})
}
})
callnet 通过这三种封装将网络连接和解决音讯解耦开,下篇文章将要介绍 callnet 对于 peer 源码的解析,不同的协定(http,tcp, protobuf)都有对应的 peer 我将取其中(tcp)解析,其它的协定下的内容都差不多。