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)解析,其它的协定下的内容都差不多。
发表回复