zinxV0.1

基础的server

框架

抽象层IServer.go

IServer.go
type IServer interface {
	// 实现一个服务器的基本三个接口,启动,停止,入口
	Start()
	Stop()
	Server()
}
实现层server.go
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
}
启动项目ZinxV0.1/Server.go
点击查看代码
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

基础的server

  1. 直接连接远程服务器,得到一个conn连接 net.Dial
  2. 连接调用Write写数据
点击查看代码
fmt.Println("client start...")
	// 1. 直接连接远程服务器,得到一个conn连接 net.Dial
	conn, err := net.Dial("tcp", "127.0.0.1:8999")
	if (err != nil) {
		fmt.Println("client start err, exit!")
		return
	}
	for {
		// 2.连接调用Write写数据
		_, err := conn.Write([]byte("Hello Zinx V0.1.."))
		if (err != nil) {
			fmt.Println("write conn err", err)
			return
		}
		buf := make([]byte, 512)
		cnt, err := conn.Read(buf)
		if (err != nil) {
			fmt.Println("Read conn err", err)
			return
		}
		fmt.Printf("server call back: %s, cnt = %d\n", buf, cnt)
		// 阻塞cpu
		time.Sleep(1 * time.Second)
	}
posted @ 2024-11-10 22:07  学学学习的菜鸟程序员  阅读(2)  评论(0编辑  收藏  举报