English | 简体中文
tcpack 是一个基于 TCP 的应用层协议,用于在 go 程序中打包和解包字节流。
众所周知,TCP 是面向字节流的传输层协议,其数据传输没有明确的边界,因此应用层读取的数据可能包含多个请求而导致无法处理业务。
tcpack 就是为了解决这个问题,将请求数据封装成消息,发送时打包,接收时解包。
注意: 在同一个连接上使用打包器并发读写消息是不安全的,不要去这样做,会带来不可预知的后果!
如果你想要使用在同一个TCP连接上的多个打包器并发地收发消息,请使用 safetcpack。
tcpack
提供了一个支持 Pack 和 Unpack 的打包器。
- 为安装 tcpack 包, 首先你需要安装 Go , 然后你可以使用下面的命令将
tcpack
作为你Go程序的依赖。
go get -u github.com/lim-yoona/tcpack
- 将 tcpack 导入到代码中:
import "github.com/lim-yoona/tcpack"
package main
import "github.com/lim-yoona/tcpack"
func main() {
// 创建一个打包器
mp := tcpack.NewMsgPack(8, tcpConn)
// 打包一个消息并发送
msg := tcpack.NewMessage(0, uint32(len([]byte(data))), []byte(data))
num, err := mp.Pack(msg)
// 解包一个消息并接收
msg, err := mp.Unpack()
}
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
// 创建一个打包器
mp := tcpack.NewMsgPack(8, tcpConn)
// data JSON Marshal
data := &Person{
Name: "jack",
Age: 20,
}
dataJSON, _ := json.Marshal(data)
// 打包一个消息并发送
msgSend := tcpack.NewMessage(0, uint32(len(dataJSON)), dataJSON)
num, err := mp.Pack(msgSend)
// 解包一个消息并接收
msgRsv, err := mp.Unpack()
// JSON UnMarshal
var dataRsv Person
json.Unmarshal(msgRsv.GetMsgData(), &dataRsv)
这有一些 示例。