Golang 发送和接收数据公共类

Stella981
• 阅读 658
package RequestCenter

import (
    "bytes"
    "io"
    "net"
    "runtime"
    "strings"
    "time"
)

//请求结构体
type QRequest struct {
    conn net.Conn
}

//构造函数
func CreateRequest(typename string, host string) *QRequest {
    request := new(QRequest)
    //GC析构前调用
    runtime.SetFinalizer(request, func(q *QRequest) {
        q.Close()
    })
    conn, err := net.Dial(typename, host)
    if err == nil {
        request.conn = conn
        return request
    }
    return nil
}

func CreateRequestWithConn(conn net.Conn) *QRequest {
    request := new(QRequest)
    //GC析构前调用
    runtime.SetFinalizer(request, func(q *QRequest) {
        q.Close()
    })
    request.conn = conn
    return request
}

//析构函数
func (q *QRequest) Close() {
    if !q.CheckReq() {
        return
    }
    q.conn.SetDeadline(time.Now())
    q.conn.Close()
}

//发送内容
func (q *QRequest) SendData(heads []string, body []byte) bool {
    if !q.CheckReq() {
        return false
    }
    var headsStr string
    if len(heads) > 0 {
        headsStr = strings.Join(heads, "\r\n") + string(body)
        count, err := q.conn.Write([]byte(headsStr))
        if err != nil || count == 0 {
            return false
        }
        return true
    } else {
        count, err := q.conn.Write(body)
        if err == nil || count == 0 {
            return false
        }
        return true
    }

}

//接收内容
func (q *QRequest) ReceiveData(timeout time.Duration) []byte {
    if !q.CheckReq() {
        return nil
    }
    if timeout > 0 {
        q.conn.SetReadDeadline(time.Now().Add(time.Millisecond * timeout))
    }
    var buf bytes.Buffer
    buffer := make([]byte, 8192)
    for {
        sizenew, err := q.conn.Read(buffer)
        buf.Write(buffer[:sizenew])
        if err == io.EOF || sizenew < 8192 {
            break
        }
    }
    return buf.Bytes()
}

func (q *QRequest) CheckReq() bool {
    if q == nil || q.conn == nil {
        return false
    }
    return true
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
go 协程
packageutilsimport("bytes""fmt""runtime""strconv")_/\__获取协程__ID\/_funcGetGoroutineID(){b:make(\\byte,64)b\b\:runtime.Stack(b,false)\b\
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Go正则提取html A 连接标签
import ("bufio""bytes""fmt""io/ioutil""net/http""os""regexp""strconv""strings")func ListHref(html string) {
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
34.TCP取样器
阅读文本大概需要3分钟。1、TCP取样器的作用   TCP取样器作用就是通过TCP/IP协议来连接服务器,然后发送数据和接收数据。2、TCP取样器详解!(https://oscimg.oschina.net/oscnet/32a9b19ba1db00f321d22a0f33bcfb68a0d.png)TCPClien
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_