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()
// Serve 运行服务器
Serve()
// AddRouter 为服务注册路由方法,供客户端连接处理使用
AddRouter(router IRouter)
}

View File

@ -14,20 +14,20 @@ type Connection struct {
// 该连接的关闭状态
IsClosed bool
// 该连接的处理方法
HandleFunc ziface.HandleFunc
// 该连接的处理方法 Router
Router ziface.IRouter
// 该连接的退出消息通知 channel
ExitBuffChan chan struct{}
}
// 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{
Conn: conn,
ConnID: connID,
IsClosed: false,
HandleFunc: handleFunc,
Router: router,
ExitBuffChan: make(chan struct{}, 1),
}
}
@ -47,12 +47,18 @@ func (c *Connection) StartReader() {
c.ExitBuffChan <- struct{}{}
continue
}
// 调用当前连接业务(这里执行的是当前连接绑定的 handle 方法)
if err := c.HandleFunc(c.Conn, buf, cnt); err != nil {
fmt.Println("ConnID =", c.ConnID, "handle is error", err)
c.ExitBuffChan <- struct{}{}
continue
req := Request{
conn: c,
data: buf[:cnt],
}
// 从路由中找到注册绑定的 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
// Port 服务器监听的端口
Port int
// Router 路由
Router ziface.IRouter
}
// NewServer 创建一个服务器句柄
@ -24,6 +26,7 @@ func NewServer(name string) ziface.IServer {
IPVersion: "tcp4",
IP: "0.0.0.0",
Port: 7777,
Router: nil,
}
}
@ -63,7 +66,7 @@ func (s *Server) Start() {
// 3.2 TODO 设置服务器最大连接数,如果超过最大连接数则关闭此新连接
// 3.3 处理该新连接请求的业务方法,此时 handler 和 conn 应该是绑定的
dealConn := NewConnection(conn, cid, CallbackToClient)
dealConn := NewConnection(conn, cid, s.Router)
cid++
// 3.4 启动当前连接的业务处理
@ -89,12 +92,8 @@ func (s *Server) Serve() {
select {}
}
// CallbackToClient 定义当前客户端连接的业务处理方法
func CallbackToClient(conn *net.TCPConn, data []byte, cnt int) error {
// 回显业务
if _, err := conn.Write(data[:cnt]); err != nil {
fmt.Println("write back buf err", err)
return fmt.Errorf("CallbackToClient error: %v", err)
}
return nil
// AddRouter 为当前服务注册一个路由方法,供客户端连接处理使用
func (s *Server) AddRouter(router ziface.IRouter) {
s.Router = router
fmt.Println("Add Router Succ!")
}

View File

@ -2,11 +2,40 @@ package znet
import (
"fmt"
"go-study/zinx/ziface"
"net"
"testing"
"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 模拟客户端
func ClientTest() {
fmt.Println("Client Test... start")
@ -42,7 +71,10 @@ func ClientTest() {
// TestServer 服务器端测试
func TestServer(t *testing.T) {
// 创建一个 Server 句柄
s := NewServer("[Zinx V0.1]")
s := NewServer("[Zinx V0.3]")
// 给当前 Zinx 框架添加一个自定义的 Router
s.AddRouter(&PingRouter{})
// 启动客户端测试
go ClientTest()