node:对连接的功能进行了封装,连接视为节点,每个节点都有一个唯一的ID,功能主要包含有请求、节点间转发数据
A:当前网络双方通信都必须有公网IP,而两个内网中的计算机无法知道对方的公网IP,就算知道也会被nat、防火墙等阻挡无法通信,Node是基于节点ID通信的,所以知道ID、对方上线,不论他是否公网都可以通信。
type Message struct {
Type uint8
Id uint32
SrcId uint16
DestId uint16
Data []byte
}
Header 13Byte | Typ 1Byte | Id 3Byte | SrcId 2Byte | DestId 2Byte | DataLength 3Byte |
---|---|---|---|---|---|
CheckSum 2Byte | |||||
Data |
单次数据最大发送长度为3个字节的正整数容量15MB
go get -u github.com/Li-giegie/node@latest
- Init 连接的初始化回调,,返回对端ID、error,如果err返回值非空,连接关闭,此步骤用于自定义认证,在服务端返回空,且ID唯一(连接列表不存在)连接会被建立,反之服务端会关闭连接并返回连接已存在错误
- Connection 同步调用:该方法在连接建立时被调用
- Handle 默认同步调用:异同步取决于你,如果该回调阻塞将影响当前连接整个生命周期(对于一些不消耗时间的任务,重新开启一个goroutine执行未必最优),框架并没有集成协程池,第三方框架众多,一时拿不定主意,索性把问题抛给你
- ErrHandle 默认同步调用:异同步取决于你,当发送消息失败时会被触发
- CustomHandle 默认同步调用:异同步取决于你,自定义消息类型处理,框架内部集成了多种消息类型,当需要一些特定的功能时可以自定义消息类型,例如心跳消息,只需把消息类型声明成框架内部不存在的类型,框架看到不认识的消息就会回调当前函数
- Disconnect 同步调用:连接断开会被触发
type Handler interface {
// Init 初始化连接返回对端ID,err将决定是否建立连接
Init(conn net.Conn) (remoteId uint16, err error)
// Connection 同步调用,连接第一次建立成功回调
Connection(conn common.Conn)
// Handle 接收到标准类型消息时触发回调
Handle(ctx common.Context)
// ErrHandle 发送失败触发的回调
ErrHandle(msg *common.Message, err error)
// CustomHandle 接收到自定义类型消息时触发回调
CustomHandle(ctx common.Context)
// Disconnect 连接断开触发回调
Disconnect(id uint16, err error)
}
一个域内节点通信示例图如下
多域间节点互相通信如下
- 增加功能