Zinx-V0.1

This commit is contained in:
fantasticbin 2025-09-13 21:08:45 +08:00
parent 899772115c
commit f5bfa7b513
3 changed files with 163 additions and 0 deletions

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

@ -0,0 +1,10 @@
package ziface
type IServer interface {
// Start 启动服务器
Start()
// Stop 停止服务器
Stop()
// Serve 运行服务器
Serve()
}

101
zinx/znet/server.go Normal file
View File

@ -0,0 +1,101 @@
package znet
import (
"fmt"
"go-study/zinx/ziface"
"net"
)
type Server struct {
// Name 服务器名称
Name string
// IPVersion tcp4 or tcp6
IPVersion string
// IP 服务器监听的 IP
IP string
// Port 服务器监听的端口
Port int
}
// NewServer 创建一个服务器句柄
func NewServer(name string) ziface.IServer {
return &Server{
Name: name,
IPVersion: "tcp4",
IP: "0.0.0.0",
Port: 7777,
}
}
// Start 启动服务器
func (s *Server) Start() {
fmt.Printf("[START] Server listenner at IP: %s, Port %d, is starting\n", s.IP, s.Port)
go func() {
// 1. 获取一个 TCP 的 Addr
addr, err := net.ResolveTCPAddr(s.IPVersion, fmt.Sprintf("%s:%d", s.IP, s.Port))
if err != nil {
fmt.Println("resolve tcp addr error:", err)
return
}
// 2. 监听服务器地址
listener, err := net.ListenTCP(s.IPVersion, addr)
if err != nil {
fmt.Println("listen", s.IPVersion, "err", err)
return
}
fmt.Println("start Zinx server ", s.Name, " succ, now listening...")
// 3. 阻塞等待客户端连接,处理客户端连接业务(读写)
for {
// 3.1 阻塞等待客户端连接AcceptTCP 会阻塞
conn, err := listener.AcceptTCP()
if err != nil {
fmt.Println("Accept err", err)
continue
}
// 3.2 TODO 设置服务器最大连接数,如果超过最大连接数则关闭此新连接
// 3.3 TODO 处理该新连接请求的业务方法,此时 handler 和 conn 应该是绑定的
// 这里暂时做一个最大 512 字节的回显服务
go func() {
// 不断的循环,从客户端获取数据
for {
buf := make([]byte, 512)
cnt, err := conn.Read(buf)
if err != nil {
fmt.Println("recv buf err", err)
continue
}
// 回显
if _, err := conn.Write(buf[:cnt]); err != nil {
fmt.Println("write back buf err", err)
continue
}
}
}()
}
}()
}
// Stop 停止服务器
func (s *Server) Stop() {
fmt.Println("[STOP] Zinx server, name ", s.Name)
// TODO 将需要清理的连接信息或者其他信息一并停止或者清理
}
// Serve 运行服务器
func (s *Server) Serve() {
s.Start()
// TODO 做一些启动服务器之后的额外业务
// 阻塞,否则主 Go 程退出listener 会退出
select {}
}

52
zinx/znet/server_test.go Normal file
View File

@ -0,0 +1,52 @@
package znet
import (
"fmt"
"net"
"testing"
"time"
)
// 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 {
_, err := conn.Write([]byte("hello Zinx"))
if err != nil {
fmt.Println("write error:", err)
return
}
buf := make([]byte, 512)
cnt, err := conn.Read(buf)
if err != nil {
fmt.Println("read buf error:", err)
return
}
fmt.Printf("server call back: %s, cnt = %d\n", string(buf[:cnt]), cnt)
time.Sleep(1 * time.Second)
}
}
// TestServer 服务器端测试
func TestServer(t *testing.T) {
// 创建一个 Server 句柄
s := NewServer("[Zinx V0.1]")
// 启动客户端测试
go ClientTest()
// 启动服务器
s.Serve()
}