在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一 、介绍cellnet是一个组件化、高扩展性、高性能的开源服务器网络库 git地址:https://github.com/davyxu/cellnet 主要使用领域:
支持多种传输协议:
支持混合消息编码:
支持多线程和单线程设计架构:
支持远程过程调用(RPC):
cellnet的主要流程和架构:
二、客户端功能#官方demo package main import ( "bufio" "github.com/davyxu/cellnet" "github.com/davyxu/cellnet/examples/chat/proto" "github.com/davyxu/cellnet/peer" "github.com/davyxu/cellnet/proc" "github.com/davyxu/golog" "os" "strings" _ "github.com/davyxu/cellnet/peer/tcp" _ "github.com/davyxu/cellnet/proc/tcp" ) var log = golog.New("client") func ReadConsole(callback func(string)) { for { // 从标准输入读取字符串,以\n为分割 text, err := bufio.NewReader(os.Stdin).ReadString('\n') if err != nil { break } // 去掉读入内容的空白符 text = strings.TrimSpace(text) callback(text) } } func main() { // 创建一个事件处理队列,整个客户端只有这一个队列处理事件,客户端属于单线程模型 queue := cellnet.NewEventQueue() // 创建一个tcp的连接器,名称为client,连接地址为127.0.0.1:8801,将事件投递到queue队列,单线程的处理(收发封包过程是多线程) p := peer.NewGenericPeer("tcp.Connector", "client", "127.0.0.1:18801", queue) // 设定封包收发处理的模式为tcp的ltv(Length-Type-Value), Length为封包大小,Type为消息ID,Value为消息内容 // 并使用switch处理收到的消息 proc.BindProcessorHandler(p, "tcp.ltv", func(ev cellnet.Event) { switch msg := ev.Message().(type) { case *cellnet.SessionConnected: log.Debugln("client connected") case *cellnet.SessionClosed: log.Debugln("client error") case *proto.ChatACK: log.Infof("sid%d say: %s", msg.Id, msg.Content) } }) // 开始发起到服务器的连接 p.Start() // 事件队列开始循环 queue.StartLoop() log.Debugln("Ready to chat!") // 阻塞的从命令行获取聊天输入 ReadConsole(func(str string) { p.(interface { Session() cellnet.Session }).Session().Send(&proto.ChatREQ{ Content: str, }) }) }
三、服务端功能#官方demo package main import ( "github.com/davyxu/cellnet" "github.com/davyxu/cellnet/examples/chat/proto" "github.com/davyxu/cellnet/peer" "github.com/davyxu/cellnet/proc" "github.com/davyxu/golog" _ "github.com/davyxu/cellnet/peer/tcp" _ "github.com/davyxu/cellnet/proc/tcp" ) var log = golog.New("server") func main() { // 创建一个事件处理队列,整个服务器只有这一个队列处理事件,服务器属于单线程服务器 queue := cellnet.NewEventQueue() // 创建一个tcp的侦听器,名称为server,连接地址为127.0.0.1:8801,所有连接将事件投递到queue队列,单线程的处理(收发封包过程是多线程) p := peer.NewGenericPeer("tcp.Acceptor", "server", "127.0.0.1:18801", queue) // 设定封包收发处理的模式为tcp的ltv(Length-Type-Value), Length为封包大小,Type为消息ID,Value为消息内容 // 每一个连接收到的所有消息事件(cellnet.Event)都被派发到用户回调, 用户使用switch判断消息类型,并做出不同的处理 proc.BindProcessorHandler(p, "tcp.ltv", func(ev cellnet.Event) { switch msg := ev.Message().(type) { // 有新的连接 case *cellnet.SessionAccepted: log.Debugln("server accepted") // 有连接断开 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 }) } }) // 开始侦听 p.Start() // 事件队列开始循环 queue.StartLoop() // 阻塞等待事件队列结束退出( 在另外的goroutine调用queue.StopLoop() ) queue.Wait() }
|
请发表评论