一个go语言实现的简洁TCP通信框架

stpro 一个基于tcp协议实现的简洁通信框架

a skeleton for communication based on TCP

github:https://github.com/by-zhang/s… 厚脸皮求star

特性

  • 引入go包即可使用
  • 实现了crc校验,保证数据传输的完整性与正确性
  • 调用方式简单明了

快速开始

1. 引入

    import "stpro"
    

2. server 端

    /** 三步搭建服务端
        1 定义任意名称struct的数据结构,必须包含Pmap、Phost两个
          字段,其中Phost为服务端ip+port拼接的字符串,Pmap为自定
          义数据包类型与数据包名称的映射。
        2 实例化对象为字段赋值,实现对应已定义`包名称`的数据包处
          理方法,方法名必为"P[包名称]",如type包的处理方法为Ptype
          。方法中请定义数据处理逻辑,输入输入皆为[]byte类型。
        3 stpro.New()传入实例化的对象,如无报错则服务端开始监听,
          并按照你所定义的逻辑处理数据包,返回响应数据。
    **/
    package main

    import (
        "fmt"
        "stpro"
    )

    type Server struct {
        Phost string
        Pmap  map[uint8]string
    }

    func (m Server) Ptype(in []byte) (out []byte) {
        fmt.Printf("客户端发来type包:%s\n", in)
        /** process... **/
        bytes := []byte("hello1")
        return bytes
    }

    func (m Server) Pname(in []byte) (out []byte) {
        fmt.Printf("客户端发来name包:%s\n", in)
        /** process... **/
        bytes := []byte("hello2")
        return bytes
    }

    func main() {
        m := Model{
            Phost: ":9091",
            Pmap:  make(map[uint8]string),
        }
        m.Pmap[0x01] = "type"
        m.Pmap[0x02] = "name"
        err := stpro.New(m)
        if err != nil {
            fmt.Println(err)
        }
   }

3.client端

    /**
        三部搭建客户端
        1 数据结构同服务端。
        2 P[type]方法是发送对应包后接收到响应数据的处理方法。
        3 实例化对象,并调用Send(type byte, content []byte)方
          法发送数据到客户端,接收到的数据后会自定按照上述定
          义方法处理。
    **/
    package main

    import (
        "fmt"
        "stpro"
    )

    type Client struct {
        Phost string
        Pmap  map[byte]string
    }

    func (c Client) Ptype(in []byte) {
        fmt.Printf("收到了type包的回复:%s\n", in)
    }

    func (c Client) Pname(in []byte) {
        fmt.Printf("收到了name包的回复:%s\n", in)
    }

    func main() {
        client, err := stpro.NewClient(Client{
            Phost: "192.168.1.106:9091",
            Pmap: map[byte]string{
            0x01: "type",
            0x02: "name",
            },
        })

        if err != nil {
            fmt.Println(err)
            return
        }

        err = client.Send(0x02, []byte("jintianzhenhao"))
        if err != nil {
            fmt.Println(err)
            return
        }

        err = client.Send(0x01, []byte("jintianzhenhao3333"))
        if err != nil {
            fmt.Println(err)
            return
        }
    }
    原文作者:Dr_Zhang
    原文地址: https://segmentfault.com/a/1190000010535922
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞