基础的server
框架
抽象层IServer.go
IServer.go
type IServer interface {
// 实现一个服务器的基本三个接口,启动,停止,入口
Start()
Stop()
Server()
}
server.go
package znet
import (
"fmt"
"net"
)
type Server struct {
Name string
IP string
IpVersion string
Port int
}
// 实现IServer中的方法
func (s *Server) Start() {
}
func (s *Server) Stop() {
}
func (s *Server) Server() {
}
func NewServer(name string) ziface.IServer {
server := &Server{
Name: name,
IpVersion: "tcp4",
IP: "0.0.0.0",
Port: 8999,
}
return server
}
点击查看代码
func main() {
// 1. 创建一个server句柄,使用Zinx的api
s := znet.NewServer("[zinx V0.1]")
// 2. 启动server
s.Server()
}
方法
启动服务器
点击查看代码
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 net.ResolveTCPAddr
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. 监听服务器的地址 net.ListenTCP
listenner, err := net.ListenTCP(s.IpVersion, addr)
if (err != nil) {
fmt.Println("listen", s.IpVersion, " err: ", err)
return
}
fmt.Println("start Zinx server succ, ", s.Name, "succ, Listenning")
// 3. 阻塞的等待客户端的连接,处理客户端连接业务(读写)
for {
// 如果有客户端连接过来,阻塞会返回 listenner.AcceptTCP()
conn, err := listenner.AcceptTCP()
if (err != nil) {
fmt.Println("Accept err", err)
continue
}
// 已经与客户端建立连接,做一些业务,做一个最基本的最大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
}
}
}()
}
}()
}
停止服务器
运行服务器
点击查看代码
func (s *Server) Server() {
s.Start()
// TODO 调用之后做阻塞处理,在之间可以做今后的扩展功能
select{}
}
初始化server
属性
name名称
监听的IP
监听的端口Port
IP版本IpVersion