对tcp连接部分以及与连接绑定的业务部分进行抽象和封装

主要是对连接的开启关闭和读写进行封装,抽象出接口,使用回调进行具体业务的绑定

zinterface/iconnection.go

package zinterface

import "net"

type IConnection interface{
Start()
Stop()
GetConnId() uint32
IsClosed() bool
Send(data []byte,len int) error
GetRemoteAddr() net.Addr
GetConn() *net.TCPConn
}
type HandleFunc func (*net.TCPConn,[]byte,int) error

znet/connection.go

package znet

import (
"log"
"net"
"zinx/zinterface"
) type Connection struct {
ConnId uint32
Conn *net.TCPConn
Closed bool
RemoteAddr net.Addr
ExitChan chan bool
HandleAPI zinterface.HandleFunc
} func NewConnection(connid uint32, conn *net.TCPConn, callback zinterface.HandleFunc) zinterface.IConnection {
c := &Connection{
ConnId: connid,
Conn: conn,
Closed: false,
ExitChan: make(chan bool, ),
HandleAPI: callback,
}
return c
}
func (c *Connection) StartRead() {
defer c.Stop()
for {
b := make([]byte, )
len, err := c.Conn.Read(b)
if err != nil {
log.Println("read tcp err ", err)
break
}
log.Printf("recv from client %s,len=%d,connid=%d", b, len,c.ConnId) if err:=c.HandleAPI(c.Conn,b,len);err!=nil{
log.Println("c.handleAPI err ",err)
break
} }
}
func (c *Connection) Start() {
go c.StartRead()
}
func (c *Connection) Stop() {
if c.Closed {
return
}
c.Closed = true
c.Conn.Close()
close(c.ExitChan)
}
func (c *Connection) GetConnId() uint32 {
return c.ConnId
} func (c *Connection) Send(data []byte, len int) error {
return nil
}
func (c *Connection) GetRemoteAddr() net.Addr {
return c.Conn.RemoteAddr()
}
func (c *Connection) GetConn() *net.TCPConn {
return c.Conn
}
func (c *Connection) IsClosed() bool {
return c.Closed
}

znet/server.go

package znet

import (
"fmt"
"errors"
"log"
"net"
"zinx/zinterface"
) type Server struct {
Name string
IP string
IPversion string
Port int
}
func Callbackapi(conn *net.TCPConn,readData []byte,len int) error{
if _, err := conn.Write(readData[:len]); err != nil {
log.Println("write tcp err ", err)
return errors.New("write tcp err")
}
log.Println("callback write...")
return nil
}
func (s *Server) Start() {
log.Printf("%s %s:%d start...\n", s.Name, s.IP, s.Port)
go func() {
addr, err := net.ResolveTCPAddr(s.IPversion, fmt.Sprintf("%s:%d", s.IP, s.Port))
if err != nil {
log.Println("resolve tcp addr err ", err)
return
}
listener, err := net.ListenTCP(s.IPversion, addr)
if err != nil {
log.Println("listen tcp err ", err)
return
}
var connid uint32
connid=
for {
conn, err := listener.AcceptTCP()
if err != nil {
log.Println("accept tcp err ", err)
continue
}
dealConn:=NewConnection(connid,conn,Callbackapi)
go dealConn.Start()
connid++
}
}() }
func (s *Server) Stop() { }
func (s *Server) Server() {
s.Start()
select {}
}
func NewServer(name string) zinterface.IServer {
s := &Server{
Name: name,
IP: "0.0.0.0",
IPversion: "tcp4",
Port: ,
}
return s
}

[Go] 轻量服务器框架基础TCP连接的抽象和封装的更多相关文章

  1. [Go] 轻量服务器框架基础TCP服务模块

    框架要先把整体的结构定义好,一般都是在$GOPATH目录的src下建立自己的目录 zinterface是一些接口的定义 znet就是接口的具体实现 IServer.go package zinterf ...

  2. [Go] 轻量服务器框架tcp的粘包问题 封包与拆包

    tcp传输的数据是以流的形式传输的,因此就没有办法判断到哪里结束算是自己的一个消息,这样就会出现粘包问题,多个包粘在一起了 可以使用这样一个自定义的形式来解决,一个消息分为 head+body  he ...

  3. [Go] 轻量服务器框架全局配置的实现以及解析json

    在一个应用中经常需要有一个配置文件,可以对代码中的参数进行配置,可以使用一个json文件来对应一个struct的对象,进行全局配置 建一个conf/zinx.json作为配置文件 { "Na ...

  4. 阿里云轻量服务器价格及轻量与ECS服务器区别比较

    https://yq.aliyun.com/articles/221647 摘要: 阿里云轻量应用服务器价格表及介绍,关于轻量应用服务器和ECS服务器的性能对比 阿里云轻量应用服务器是阿里云新推出的服 ...

  5. 腾讯云轻量服务器通过Docker搭建外网可访问连接的redis5.x集群

    总结记录/朱季谦 最近买了一台4核16的腾讯云轻量应用服务器,花了我快四百的大洋,打算搭建一堆docker组件集群,最先开始是通过docker搭建redis集群,计划使用三个端口,分别是7001,70 ...

  6. Android轻量缓存框架--ASimpleCache

    [转] 大神真面目 稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! ...

  7. Cardinal:一个用于移动项目开发的轻量 CSS 框架

    Cardinal 是一个适用于移动项目的 CSS 框架,包含很多有用的默认样式.矢量字体.可重用的模块以及一个简单的响应式模块系统.Cardinal 提供了一种在多种移动设备上实现可伸缩的字体和布局的 ...

  8. mysql服务器,大量tcp连接状态TIME_WAIT

    今天早上,java应用中发现too many open files,检查了下使用的连接数发现基本上在两三百左右,mysql打开的文件数也就几百左右,再看所有tcp连接,发现3306的连接有4000多, ...

  9. 阿里云轻量应用服务器——配置MySQL远程连接(踩坑,LAMP+CentOS)

    说在前面 本文讲解清晰,从0开始 如不能用Navicat等数据库软件远程登陆,请先检查:安全>防火墙中 是否添加了MYSQL的3306端口(ECS服务器请检查 安全组)如未添加,先点右上角“添加 ...

随机推荐

  1. 移动开发在路上-- IOS移动开发系列 多线程二

    最近太忙没太多的时间,忙碌的码农生活空下来一点时间,都会挤出来看一些技术或者咨询的文章,废话不多说,直奔主题. 接着上一次的继续说. 定时器在多线程的使用 NSRunLoop 是线程相关的基础框架的一 ...

  2. 编译安装nginx时配置开机自启

    详细编译安装nginx请参考[Nginx目录结构与配置文件详解]以及[Nginx安装部署],在这里就进行简单安装 安装Nginx 环境介绍 操作系统: [root@localhost ~]# cat ...

  3. js原生实现链式动画效果

    // 1. css样式 div { width: 100px; height: 100px; background: olivedrab; position: absolute; left: 0px; ...

  4. 201871010119-帖佼佼《面向对象程序设计(java)》第7周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  5. Linux之find命令操作技巧

    一.前言 工作中,我们常用find命令查找某些文件或者删除一些旧的日志文件,所以学会find命令的操作技巧就极为重要. 二.find常用参数选项 -depth 从指定目录下最深层的子目录开始查找 -m ...

  6. 安卓逆向基础(002)-android虚拟机

    一, android分两种 1.Android 5.0以下(不含5.0) dalvik字节码 为dalvik虚拟机(jit机制) 基于寄存器架构 .dex=>dexopt=>.odex d ...

  7. Spring Cloud Config入门(本地配置)

    spring cloud config 简介 Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持.使用Config Server,您可以在所有环境中管理应用程序的外 ...

  8. TrueTime的安装、运行例程

    一.前言 Truetime的安装是为了完成课程相关需求,但在安装过程中遇到一些问题,想到自己之前注册了博客所以打算把这个作为第一篇的内容.请放心这个的安装过程并不困难,可以放心食用. 二.准备 Tru ...

  9. BIM工程信息管理系统-详细设计

    详细设计说明书 1引言 1.1编写目的 编写详细设计说明书的目的就是为程序员写出实际的程序代码提供依据.它是软件详细设计阶段所有任务和所有相关人员所需的参考资料. 1.2背景 说明: a.  软件名称 ...

  10. Redis—数据备份与恢复

    https://www.cnblogs.com/shizhengwen/p/9283973.html https://blog.csdn.net/w2393040183/article/details ...