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
- 直接连接远程服务器,得到一个conn连接 net.Dial
- 连接调用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)
}
随机推荐
- vs2022不安装docker desktop可以打包镜像吗
vs2022开发的项目可以直接打包镜像到 linux主机. idea 可以使用docker插件直接打包镜像到linux,我想vs2022也可以,于是开始摸索 官网只说支持docker desktop ...
- ai识图测试
var code = "9392b629-0d84-43ef-9b0f-34740fb024a6"
- Docker高级:Redis集群实战!4主4从缩容到3主3从,怎么处理?
在上一篇,我们学会了redis集群的扩容.从3主3从扩容到4主4从. 那么,接着,活动过去了.流量没有那么大了.需要缩容了.从4主4从缩容到3主3从了.那么这个时候又该怎么处理呢? PS本系列:< ...
- 结合mysql 架构分析SQL查询语句和更新语句的执行
结合mysql 架构分析SQL查询语句和更新语句的执行 一:基础架构 mysql分为Server层和存储引擎层 Server层 涵盖了大多数mysql的核心服务功能,以及所有内置的函数(例如日期.加密 ...
- vue3项目部署到Github
此教程适应于以webpack,vue-cli,vite等脚手架构建的vue项目.当然,vue2和vue3都是可以滴. 1. 前提:你的代码库已经提交到Github上 如果没有的话,请到GitHub上新 ...
- SQL Server – 基本操作 Table 和 Column
前言 日常都是用 EF Core 来管理 Database, 偶尔也用 Management Studio, 就是很少手写 Command. 虽然网上一拉就有很多, 但是每次写单侧都要到处找还是挺烦的 ...
- JavaScript – Web Worker
前言 在上一篇 << 单线程 与 执行机制 >> 中, 我们提到了 Web Worker. 它的诞生是为了解决 JS 主线程执行耗时计算时, 导致 UI 无法及时更新的卡死现象 ...
- ASP.NET Core – 操作 Uri 和 Query
前言 以前就有写过了 Asp.net core 学习笔记 (操作 URL 和 Query), 但很乱, 这篇作为整理. Uri 介绍 结构: [Scheme]://[Host]:[Port][/Pat ...
- Figma 学习笔记 – Scroll and Position Fixed
Scroll Scroll 属于 prototype 的一部分. 当一个 Frame 的内容超出 Frame 的高度或宽度时, Frame 就具备了 scroll 的能力. 通过 uncheck cl ...
- 3. 无重复字符的最长子串 Golang实现
题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度. 注意区分子串和子序列. 示例 3: 输入: s = "pwwkew" 输出: 3 解释: 因为无重复 ...