Zinx-V0.3

This commit is contained in:
fantasticbin 2025-09-14 13:59:56 +08:00
parent 3b181b7b41
commit e9a96a95e4
8 changed files with 109 additions and 19 deletions

8
zinx/ziface/irequest.go Normal file
View File

@ -0,0 +1,8 @@
package ziface
type IRequest interface {
// GetConnection 获取请求连接信息
GetConnection() IConnection
// GetData 获取请求消息数据
GetData() []byte
}

10
zinx/ziface/irouter.go Normal file
View File

@ -0,0 +1,10 @@
package ziface
type IRouter interface {
// PreHandle 在处理连接业务之前的钩子方法
PreHandle(request IRequest)
// Handle 处理连接业务的主方法
Handle(request IRequest)
// PostHandle 在处理连接业务之后的钩子方法
PostHandle(request IRequest)
}

View File

@ -7,4 +7,6 @@ type IServer interface {
Stop() Stop()
// Serve 运行服务器 // Serve 运行服务器
Serve() Serve()
// AddRouter 为服务注册路由方法,供客户端连接处理使用
AddRouter(router IRouter)
} }

View File

@ -14,20 +14,20 @@ type Connection struct {
// 该连接的关闭状态 // 该连接的关闭状态
IsClosed bool IsClosed bool
// 该连接的处理方法 // 该连接的处理方法 Router
HandleFunc ziface.HandleFunc Router ziface.IRouter
// 该连接的退出消息通知 channel // 该连接的退出消息通知 channel
ExitBuffChan chan struct{} ExitBuffChan chan struct{}
} }
// NewConnection 创建连接的方法 // NewConnection 创建连接的方法
func NewConnection(conn *net.TCPConn, connID uint32, handleFunc ziface.HandleFunc) ziface.IConnection { func NewConnection(conn *net.TCPConn, connID uint32, router ziface.IRouter) ziface.IConnection {
return &Connection{ return &Connection{
Conn: conn, Conn: conn,
ConnID: connID, ConnID: connID,
IsClosed: false, IsClosed: false,
HandleFunc: handleFunc, Router: router,
ExitBuffChan: make(chan struct{}, 1), ExitBuffChan: make(chan struct{}, 1),
} }
} }
@ -47,12 +47,18 @@ func (c *Connection) StartReader() {
c.ExitBuffChan <- struct{}{} c.ExitBuffChan <- struct{}{}
continue continue
} }
// 调用当前连接业务(这里执行的是当前连接绑定的 handle 方法)
if err := c.HandleFunc(c.Conn, buf, cnt); err != nil { req := Request{
fmt.Println("ConnID =", c.ConnID, "handle is error", err) conn: c,
c.ExitBuffChan <- struct{}{} data: buf[:cnt],
continue
} }
// 从路由中找到注册绑定的 Conn 对应的 router 调用
go func(request ziface.IRequest) {
// 执行注册的路由方法
c.Router.PreHandle(request)
c.Router.Handle(request)
c.Router.PostHandle(request)
}(&req)
} }
} }

22
zinx/znet/request.go Normal file
View File

@ -0,0 +1,22 @@
package znet
import (
"go-study/zinx/ziface"
)
type Request struct {
// 已经和客户端建立好的连接
conn ziface.IConnection
// 客户端请求的数据
data []byte
}
// GetConnection 获取请求连接信息
func (req *Request) GetConnection() ziface.IConnection {
return req.conn
}
// GetData 获取请求消息数据
func (req *Request) GetData() []byte {
return req.data
}

11
zinx/znet/router.go Normal file
View File

@ -0,0 +1,11 @@
package znet
import "go-study/zinx/ziface"
// BaseRouter 提供一个默认的处理方法
// 实现 router 时,先嵌入这个 BaseRouter然后根据需要重写方法
type BaseRouter struct{}
func (br *BaseRouter) PreHandle(request ziface.IRequest) {}
func (br *BaseRouter) Handle(request ziface.IRequest) {}
func (br *BaseRouter) PostHandle(request ziface.IRequest) {}

View File

@ -15,6 +15,8 @@ type Server struct {
IP string IP string
// Port 服务器监听的端口 // Port 服务器监听的端口
Port int Port int
// Router 路由
Router ziface.IRouter
} }
// NewServer 创建一个服务器句柄 // NewServer 创建一个服务器句柄
@ -24,6 +26,7 @@ func NewServer(name string) ziface.IServer {
IPVersion: "tcp4", IPVersion: "tcp4",
IP: "0.0.0.0", IP: "0.0.0.0",
Port: 7777, Port: 7777,
Router: nil,
} }
} }
@ -63,7 +66,7 @@ func (s *Server) Start() {
// 3.2 TODO 设置服务器最大连接数,如果超过最大连接数则关闭此新连接 // 3.2 TODO 设置服务器最大连接数,如果超过最大连接数则关闭此新连接
// 3.3 处理该新连接请求的业务方法,此时 handler 和 conn 应该是绑定的 // 3.3 处理该新连接请求的业务方法,此时 handler 和 conn 应该是绑定的
dealConn := NewConnection(conn, cid, CallbackToClient) dealConn := NewConnection(conn, cid, s.Router)
cid++ cid++
// 3.4 启动当前连接的业务处理 // 3.4 启动当前连接的业务处理
@ -89,12 +92,8 @@ func (s *Server) Serve() {
select {} select {}
} }
// CallbackToClient 定义当前客户端连接的业务处理方法 // AddRouter 为当前服务注册一个路由方法,供客户端连接处理使用
func CallbackToClient(conn *net.TCPConn, data []byte, cnt int) error { func (s *Server) AddRouter(router ziface.IRouter) {
// 回显业务 s.Router = router
if _, err := conn.Write(data[:cnt]); err != nil { fmt.Println("Add Router Succ!")
fmt.Println("write back buf err", err)
return fmt.Errorf("CallbackToClient error: %v", err)
}
return nil
} }

View File

@ -2,11 +2,40 @@ package znet
import ( import (
"fmt" "fmt"
"go-study/zinx/ziface"
"net" "net"
"testing" "testing"
"time" "time"
) )
type PingRouter struct {
BaseRouter
}
func (pr *PingRouter) PreHandle(request ziface.IRequest) {
fmt.Println("Call Router PreHandle")
_, err := request.GetConnection().GetTCPConnection().Write([]byte("before ping...\n"))
if err != nil {
fmt.Println("call back before ping error")
}
}
func (pr *PingRouter) Handle(request ziface.IRequest) {
fmt.Println("Call PingRouter Handle")
_, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping\n"))
if err != nil {
fmt.Println("call back ping error")
}
}
func (pr *PingRouter) PostHandle(request ziface.IRequest) {
fmt.Println("Call Router PostHandle")
_, err := request.GetConnection().GetTCPConnection().Write([]byte("after ping...\n"))
if err != nil {
fmt.Println("call back after ping error")
}
}
// ClientTest 模拟客户端 // ClientTest 模拟客户端
func ClientTest() { func ClientTest() {
fmt.Println("Client Test... start") fmt.Println("Client Test... start")
@ -42,7 +71,10 @@ func ClientTest() {
// TestServer 服务器端测试 // TestServer 服务器端测试
func TestServer(t *testing.T) { func TestServer(t *testing.T) {
// 创建一个 Server 句柄 // 创建一个 Server 句柄
s := NewServer("[Zinx V0.1]") s := NewServer("[Zinx V0.3]")
// 给当前 Zinx 框架添加一个自定义的 Router
s.AddRouter(&PingRouter{})
// 启动客户端测试 // 启动客户端测试
go ClientTest() go ClientTest()