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)
}
随机推荐
- 模板链表类的扩展(QListEx<T>)
以前写的链表都是比较简单的,插入节点是在头节点上,所以循环链表时都是从最后一个数据往前找的,给人的感觉是倒着的, 今天写一个在链表尾部插入数据 1.链表节点类的定义 /链表节点类 template & ...
- csdn 下载券恶心之处
今天在csdn碰到一个恶心事,啥事呢?下载券.详细的说,就是人家码友把下载积分都设置成0了,让大家自行下载.结果,却不行,非得搞个下载券,得去做任务,给它的广告爹爹们点点任务才能获取下载券的code. ...
- [python][selenium] Web UI自动化8种页面元素定位方式
关联文章:Web UI自动化页面切换iframe框架 简单的加个前置知识: 第一:webdriver.Chrome()这句话,通过WebDriver的构造方法,拿到浏览器驱动的对象,然后通过这个对象, ...
- 互联网医疗|基于音视频SDK和即时通讯IM技术实现线上问诊功能
近期,包括北上广深在内的国内多个城市相继推动线上医保购药试点,实施进展备受网民关注. 不止于线上买药,包括健康咨询.在线问诊在内的互联网医疗服务进一步满足了人们对便捷医疗服务的需求,得到了相关政策的积 ...
- EF Core – Temporal Table 时态表
前言 EF core 6.0 开始有 build-in 的 Temporal Table 支持了. 关于 SQL Server Temporal Table 可以看这篇. 主要参考 What's Ne ...
- Hadoop & Redis未授权漏洞实战——Vulfocus服务攻防
什么是未授权访问漏洞?Hadoop & Redis靶场实战--Vulfocus服务攻防 一.介绍 未授权访问,也称为未经授权的访问或非法访问,是指在没有得到适当权限或授权的情况下,个人或系统访 ...
- C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- 解决 SHADERed无法打开,报错 缺失XINPUT1_4.DLL 文件的办法
起因: 在给某个不知名的同事安装软件时遇到的一个问题,安装完成后打开软件报错:SHADERed无法打开,报错 缺失XINPUT1_4.DLL ,C++依赖项均已打上,卸载C++插件后依然报错只能找缺失 ...
- SpringCloud入门(四)Ribbon负载均衡
一.Ribbon负载均衡原理SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的. SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTempl ...
- USB协议详解第5讲(USB描述符-接口描述符)
1.USB描述符 USB描述符有设备描述符.标准配置描述符.接口描述符.端点描述符.字符串描述符,HID设备有HID描述符.报告描述符和物理描述符.今天主要是学习USB接口描述符的组成. 2.接口描述 ...