Zinx-V0.2
链接模块
链接的封装和业务的绑定
属性
原生套接字 net.Conn
链接ID uint32
当前的conn是否是关闭状态isClosed bool
与当前链接绑定的客户端业务
方法
- 启动链接:当链接模块进行,读写操作。
//先进行读业务
go c.StartReader
//再进行写业务
- 处理读业务的Reader方法,调用已经注册好的Handle方法
func (c *Connection) StartReader() {
defer c.Stop()
for {
buf := make([]byte, 512)
cnt, err := c.Conn.Read(buf)
if err != nil {
fmt.Println("recv fub err ", err)
continue
}
//回显
if err := c.handleAPI(c.Conn, buf, cnt); err != nil {
fmt.Println("ConnID")
}
}
}
- 停止链接:关闭套接字/做一些资源回收
- 获取链接ID
- 获取链接的原生socket套接字
- 查看对端客户端的IP和端口
- 发送数据的方法Send
Request模块
属性
链接
数据
数据长度
方法
得到数据长度方法
得到当前请求的链接
得到链接的数据
抽象层
package ziface
/*
抽象 IRequest 一次性请求的数据封装
*/
type IRequest interface {
//得到当前的请求的链接
GetConnection() IConnection
//得到链接的数据
GetData() []byte
//得到链接的长度
GetDataLen() int
}
实现层
package net
import "zinx/ziface"
type Request struct {
//链接信息
conn ziface.IConnection
//数据内容
data []byte
//数据长度
len int
}
func NewReqeust(conn ziface.IConnection, data []byte, len int) ziface.IRequest {
req := &Request{
conn:conn,
data:data,
len:len,
}
return req
}
//得到当前的请求的链接
func(r *Request) GetConnection() ziface.IConnection {
return r.conn
}
//得到链接的数据
func(r *Request) GetData() []byte {
return r.data
}
//得到链接的长度
func(r *Request) GetDataLen() int {
return r.len
}
//将当前一次性得到的对端客户端请求的数据 封装成一个Request
req := NewReqeust(c, buf, cnt)
//将数据 传递给我们 定义好的Handle Callback方法
if err := c.handleAPI(req); err != nil {
fmt.Println("ConnID", c.ConnID, "Handle is error", err)
break
业务层
func CallBackBusi(request ziface.IRequest) error {
//回显业务
fmt.Println("【conn Handle】 CallBack..")
c := request.GetConnection().GetTCPConnection()
buf := request.GetData()
cnt := request.GetDataLen()
if _, err := c.Write(buf[:cnt]);err !=nil {
fmt.Println("write back err ", err)
return err
}
return nil
}