go-study/zinx/znet/server_test.go
2025-09-14 15:52:04 +08:00

94 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package znet
import (
"fmt"
"go-study/zinx/ziface"
"net"
"testing"
"time"
)
type PingRouter struct {
BaseRouter
}
func (pr *PingRouter) Handle(request ziface.IRequest) {
fmt.Println("Call PingRouter Handle")
// 先读取客户端的数据再回写ping...ping...ping
fmt.Println("recv from client: msgID=", request.GetMsgID(), ", data=", string(request.GetData()))
// 回写数据
err := request.GetConnection().SendMsg(1, []byte("ping...ping...ping\n"))
if err != nil {
fmt.Println("call back ping error:", err.Error())
}
}
// ClientTest 模拟客户端
func ClientTest() {
fmt.Println("Client Test... start")
// 3s 之后发起测试请求,给服务器端开启服务的机会
time.Sleep(3 * time.Second)
conn, err := net.Dial("tcp", "127.0.0.1:7777")
if err != nil {
fmt.Println("client dial err:", err)
return
}
for {
// 发送封包数据
dp := NewDataPack()
msg, _ := dp.Pack(NewMsgPackage(0, []byte("Zinx V0.5 Client Test Message")))
if _, err := conn.Write(msg); err != nil {
fmt.Println("write error:", err)
return
}
// 服务器回复一个数据,先读出流中的 head 部分
headData := make([]byte, dp.GetHeadLen())
if _, err := conn.Read(headData); err != nil {
fmt.Println("read head error:", err)
break
}
// 拆包,得到 msgID 和 dataLen 放在 msg 中
msgHead, err := dp.Unpack(headData)
if err != nil {
fmt.Println("unpack head error:", err)
return
}
if msgHead.GetDataLen() > 0 {
// msg 是有数据的,需要再次读取 dataLen 个字节的数据
msg := msgHead.(*Message)
msg.data = make([]byte, msg.GetDataLen())
// 根据 dataLen 的长度再次从io中读取
if _, err := conn.Read(msg.data); err != nil {
fmt.Println("read msg data error:", err)
return
}
fmt.Println("==> Recv Server Msg: ID=", msg.GetMsgID(), ", len=", msg.GetDataLen(), ", data=", string(msg.GetData()))
}
time.Sleep(1 * time.Second)
}
}
// TestServer 服务器端测试
func TestServer(t *testing.T) {
// 创建一个 Server 句柄
s := NewServer()
// 给当前 Zinx 框架添加一个自定义的 Router
s.AddRouter(&PingRouter{})
// 启动客户端测试
go ClientTest()
// 启动服务器
s.Serve()
}