前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >组件分享之后端组件——组件化、高扩展性、高性能的开源服务器网络库cellnet

组件分享之后端组件——组件化、高扩展性、高性能的开源服务器网络库cellnet

作者头像
cn華少
发布2022-04-24 19:22:41
5650
发布2022-04-24 19:22:41
举报
文章被收录于专栏:IT综合技术分享IT综合技术分享

组件分享之后端组件——组件化、高扩展性、高性能的开源服务器网络库cellnet

背景

近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。

组件基本信息

内容

本节我们进行分享一个组件化、高扩展性、高性能的开源服务器网络库cellnet,以下是其官方介绍的应用领域:

主要使用领域: 游戏服务器 方便定制私有协议,快速构建逻辑服务器、网关服务器、服务器间互联互通、对接第三方SDK、转换编码协议等 ARM设备 设备间网络通讯 证券软件 内部RPC

它能让我们在建立一些TCP连接器时进行有效重连、优化重启,其架构可以参考下图

使用案例如下:

代码语言:javascript
复制
const peerAddress = "127.0.0.1:17701"

// 服务器逻辑
func server() {

    // 创建服务器的事件队列,所有的消息,事件都会被投入这个队列处理
    queue := cellnet.NewEventQueue()

    // 创建一个服务器的接受器(Acceptor),接受客户端的连接
    peerIns := peer.NewGenericPeer("tcp.Acceptor", "server", peerAddress, queue)

    // 将接受器Peer与tcp.ltv的处理器绑定,并设置事件处理回调
    // tcp.ltv处理器负责处理消息收发,使用私有的封包格式以及日志,RPC等处理
    proc.BindProcessorHandler(peerIns, "tcp.ltv", func(ev cellnet.Event) {

        // 处理Peer收到的各种事件
        switch msg := ev.Message().(type) {
        case *cellnet.SessionAccepted: // 接受一个连接
            fmt.Println("server accepted")
        case *TestEchoACK: // 收到连接发送的消息

            fmt.Printf("server recv %+v\n", msg)

            // 发送回应消息
            ev.Session().Send(&TestEchoACK{
                Msg:   msg.Msg,
                Value: msg.Value,
            })

        case *cellnet.SessionClosed: // 会话连接断开
            fmt.Println("session closed: ", ev.Session().ID())
        }

    })

    // 启动Peer,服务器开始侦听
    peerIns.Start()

    // 开启事件队列,开始处理事件,此函数不阻塞
    queue.StartLoop()
}

// 模拟客户端逻辑
func client() {

    // 例子专用的完成标记
    done := make(chan struct{})

    // 创建客户端的事件处理队列
    queue := cellnet.NewEventQueue()

    // 创建客户端的连接器
    peerIns := peer.NewGenericPeer("tcp.Connector", "client", peerAddress, queue)

    // 将客户端连接器Peer与tcp.ltv处理器绑定,并设置接收事件回调
    proc.BindProcessorHandler(peerIns, "tcp.ltv", func(ev cellnet.Event) {

        switch msg := ev.Message().(type) {
        case *cellnet.SessionConnected: // 已经连接上
            fmt.Println("client connected")
            ev.Session().Send(&TestEchoACK{
                Msg:   "hello",
                Value: 1234,
            })
        case *TestEchoACK: //收到服务器发送的消息

            fmt.Printf("client recv %+v\n", msg)

            // 完成操作
            done <- struct{}{}

        case *cellnet.SessionClosed:
            fmt.Println("client closed")
        }
    })

    // 开启客户端Peer
    peerIns.Start()

    // 开启客户端队列处理
    queue.StartLoop()

    // 等待客户端收到消息
    <-done
}

以上内容均来源于cellnet中的README,有需要的小伙伴可以进行点击深入了解,目前游戏领域使用还是比较多的。

本文声明:

知识共享许可协议

本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022.04.03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 组件分享之后端组件——组件化、高扩展性、高性能的开源服务器网络库cellnet
    • 背景
      • 组件基本信息
        • 内容
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档