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()
|
Stop()
|
||||||
// Serve 运行服务器
|
// Serve 运行服务器
|
||||||
Serve()
|
Serve()
|
||||||
|
// AddRouter 为服务注册路由方法,供客户端连接处理使用
|
||||||
|
AddRouter(router IRouter)
|
||||||
}
|
}
|
||||||
|
@ -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
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
|
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
|
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user