Zinx-V0.3
This commit is contained in:
parent
3b181b7b41
commit
e9a96a95e4
8
zinx/ziface/irequest.go
Normal file
8
zinx/ziface/irequest.go
Normal file
@ -0,0 +1,8 @@
|
||||
package ziface
|
||||
|
||||
type IRequest interface {
|
||||
// GetConnection 获取请求连接信息
|
||||
GetConnection() IConnection
|
||||
// GetData 获取请求消息数据
|
||||
GetData() []byte
|
||||
}
|
10
zinx/ziface/irouter.go
Normal file
10
zinx/ziface/irouter.go
Normal file
@ -0,0 +1,10 @@
|
||||
package ziface
|
||||
|
||||
type IRouter interface {
|
||||
// PreHandle 在处理连接业务之前的钩子方法
|
||||
PreHandle(request IRequest)
|
||||
// Handle 处理连接业务的主方法
|
||||
Handle(request IRequest)
|
||||
// PostHandle 在处理连接业务之后的钩子方法
|
||||
PostHandle(request IRequest)
|
||||
}
|
@ -7,4 +7,6 @@ type IServer interface {
|
||||
Stop()
|
||||
// Serve 运行服务器
|
||||
Serve()
|
||||
// AddRouter 为服务注册路由方法,供客户端连接处理使用
|
||||
AddRouter(router IRouter)
|
||||
}
|
||||
|
@ -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
22
zinx/znet/request.go
Normal 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
11
zinx/znet/router.go
Normal 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) {}
|
@ -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!")
|
||||
}
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user