一个定义了基本交互报文的tcp C/S端链接sdk,简化链接服务构建,使用方式如下方demo
注册帧(对使用者透明)
| ZM | 19 | 0 | 1 | clientID |
| 头 | 长度位 | 类型位 | 报文编号 | 载荷 |
|---|---|---|---|---|
| ZM | uint32 | int8 | uint64 | string |
数据存储类型采用大端字节序
类型位,载荷位用户自定义,但约定发送类型为1
126,Ack类型为对应的-1-126
demo
server端
package zmlink
import (
"log/slog"
"testing"
)
type linstenerTestEventHandler struct{}
func (t linstenerTestEventHandler) OnStream(link *Link, payload Payload, dir StreamDir) {
slog.Info("OnStream", "client_id", link.GetClientID(), "payload", string(payload.Bytes()), "dir", dir.String())
if dir == StreamIncoming {
link.ASend(payload.Ack([]byte("回复点消息拉卡拉绿绿绿绿绿绿绿")), nil)
}
}
func (t linstenerTestEventHandler) OnStatus(link *Link, statusType StatusType) {
slog.Info("OnStatus", "client_id", link.GetClientID(), "status", statusType)
}
func TestLink_ASend(t *testing.T) {
service := NewLinkListener("tcp", ":4469", &linstenerTestEventHandler{})
service.Start()
select {}
/*for{
time.Sleep(4 *time.Second)
payload, _ := NewBytesPayload(1, []byte("hahahahah"))
link := service.GetLink("1235")
if link != nil {
send, err := link.SSend(payload, 0)
slog.Info("send result", "payload", string(send.Bytes()), "error", err)
}
}*/
}client端
package zmlink
import (
"log/slog"
"testing"
)
type clientTestEventHandler struct{}
func (t clientTestEventHandler) OnStream(link *Link, payload Payload, dir StreamDir) {
slog.Info("OnStream", "client_id", link.GetClientID(), "payload", string(payload.Bytes()), "dir", dir.String())
}
func (t clientTestEventHandler) OnStatus(link *Link, statusType StatusType) {
slog.Info("OnStatus", "client_id", link.GetClientID(), "status", statusType)
}
func TestClientLink_ASend(t *testing.T) {
service := NewLinkClient("1235", "tcp", ":4469", &clientTestEventHandler{})
service.Start()
for {
time.Sleep(4 * time.Second)
payload, _ := NewBytesPayload(1, []byte("22ZM222"))
link := service.GetLink()
if link == nil {
slog.Error("connection closed")
continue
}
send, err := link.SSend(payload, 10*time.Second)
if err != nil {
slog.Error("SSend failed", "error", err)
continue
}
fmt.Println(string(send.Bytes()))
err = link.ASend(payload, func(p Payload) {
slog.Info("clientDataHandler", "payload", string(p.Bytes()))
})
if err != nil {
slog.Error("ASend failed", "error", err)
continue
}
}
}