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