tcp server 用于给andriod 客户端定时发送消息
龙赣华
2019-05-15 716536df466c5ef86cbdc76a74fceced4f861e13
add logrus
11个文件已添加
5431 ■■■■■ 已修改文件
esutil/EsClient.go 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
go.mod 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
go.sum 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
log/error.log 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
log/error.log.201905130000 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
log/info.log 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
log/info.log.201905130000 5108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
log/log.go 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pack/pack.go 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server.go 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test 补丁 | 查看 | 原始文档 | blame | 历史
esutil/EsClient.go
New file
@@ -0,0 +1,100 @@
package esutil
import (
    "encoding/json"
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    "strconv"
    "strings"
    "time"
    log "github.com/long/test/log"
)
func GetEsDataReq(url string, parama string, isSource bool) (error, map[string]interface{}) {
    log.Log.Infoln("es 查询请求路径" + url) //  配置信息 获取
    req, err := http.NewRequest("POST", url, strings.NewReader(parama))
    if err != nil {
        log.Log.Errorln("build request error! ")
        return err, nil
    }
    req.Header.Add("Content-Type", "application/json")
    timeout := time.Duration(10 * time.Second) //超时时间50ms
    client := &http.Client{Timeout: timeout}
    resp, err := client.Do(req)
    if err != nil {
        return err, nil
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return err, nil
    }
    jsonStr := string(body)
    var dat map[string]interface{}
    dec := json.NewDecoder(strings.NewReader(jsonStr))
    if err := dec.Decode(&dat); err == io.EOF {
        log.Log.Infoln(err.Error())
        return err, nil
    } else if err != nil {
        log.Log.Errorln(err.Error())
        return err, nil
    }
    // 是否需要 解析 es 返回的 source
    if isSource {
        dat = dat["hits"].(map[string]interface{})
        var data = make(map[string]interface{}, 2)
        data["total"] = dat["total"]
        sources := []interface{}{}
        for _, value := range dat["hits"].([]interface{}) {
            source := value.(map[string]interface{})["_source"].(map[string]interface{})
            source["id"] = value.(map[string]interface{})["_id"]
            sdkType := source["sdkType"]
            if sdkType != nil {
                sdk, _ := strconv.Atoi(sdkType.(string))
                source["sdkType"] = sdkTypeToValue(sdk)
            }
            sources = append(sources, source)
        }
        data["datalist"] = sources
        return nil, data
    } else {
        return nil, dat
    }
}
//sdk类型
func sdkTypeToValue(i int) string {
    value := []string{"人脸", "车辆", "人体", "入侵", "拥挤", "靠右行", "人员异常", "个体静止"}
    return value[i-1]
}
func PostAction(sec int, Eurl string) []byte {
    index := "videopersons,personaction"
    url := fmt.Sprintf("%s%s%s", Eurl, index, "/_search")
    seccond := strconv.Itoa(sec)
    prama := "{\"query\":{\"bool\":{\"filter\":[{\"term\":{\"personIsHub\":\"1\"}},{\"range\":{\"picDate\":{\"gte\":\"now+8h-" + seccond + "s\",\"lt\":\"now+8h\"}}}]}},\"size\":\"1000\",\"sort\":[{\"picDate\":{\"order\":\"desc\"}}]," +
        "\"_source\":[\"BaseName\",\"Gender\",\"Race\",\"content\",\"idcard\",\"picAddress\",\"picDate\",\"sdkType\",\"Age\",\"personId\",\"personIsHub\",\"personPicUrl\",\"picLocalUrl\",\"picSmUrl\",\"videoIp\",\"videoNum\",\"videoReqNum\",\"ageDescription\",\"likePer\",\"picMaxUrl\"]" + "}"
    err, tokenRes := GetEsDataReq(url, prama, true)
    if err != nil {
        log.Log.Errorln(err)
        return nil
    }
    jsonstring, _ := json.Marshal(tokenRes)
    if len(jsonstring) <= 26 {
        return nil
    }
    return jsonstring
}
go.mod
New file
@@ -0,0 +1,12 @@
module github.com/long/test
go 1.12
require (
    github.com/lestrrat-go/file-rotatelogs v2.2.0+incompatible
    github.com/lestrrat-go/strftime v0.0.0-20180821113735-8b31f9c59b0f // indirect
    github.com/pkg/errors v0.8.1
    github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
    github.com/rs/zerolog v1.14.3
    github.com/sirupsen/logrus v1.4.1
)
go.sum
New file
@@ -0,0 +1,29 @@
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/lestrrat-go/file-rotatelogs v2.2.0+incompatible h1:eXEwY0f2h6mcobdAxm4VRSWds4tqmlLdUqxu8ybiEEA=
github.com/lestrrat-go/file-rotatelogs v2.2.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
github.com/lestrrat-go/strftime v0.0.0-20180821113735-8b31f9c59b0f h1:/o/LRlB6dBTBNViFglNdGfsDHBjdL8Yvfm7qQE4ZUh0=
github.com/lestrrat-go/strftime v0.0.0-20180821113735-8b31f9c59b0f/go.mod h1:RMlXygAD3c48Psmr06d2G75L4E4xxzxkIe/+ppX9eAU=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo=
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM=
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/zerolog v1.14.3 h1:4EGfSkR2hJDB0s3oFfrlPqjU1e4WLncergLil3nEKW0=
github.com/rs/zerolog v1.14.3/go.mod h1:3WXPzbXEEliJ+a6UFE4vhIxV8qR1EML6ngzP9ug4eYg=
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
log/error.log
New file
@@ -0,0 +1 @@
log/error.log.201905130000
log/error.log.201905130000
New file
@@ -0,0 +1,12 @@
{"level":"error","msg":"EOF remoteAddr  192.168.1.123:36326  close","time":"2019-05-15T13:54:16+08:00"}
{"level":"error","msg":"EOF remoteAddr  192.168.1.123:36328  close","time":"2019-05-15T13:56:25+08:00"}
{"level":"error","msg":"EOF remoteAddr  192.168.1.123:36338  close","time":"2019-05-15T14:06:10+08:00"}
{"level":"error","msg":"EOF remoteAddr  192.168.1.123:36504  close","time":"2019-05-15T14:06:54+08:00"}
{"level":"error","msg":"EOF remoteAddr  192.168.1.123:36508  close","time":"2019-05-15T14:17:30+08:00"}
{"level":"error","msg":"EOF remoteAddr  192.168.1.123:36988  close","time":"2019-05-15T14:20:55+08:00"}
{"level":"error","msg":"EOF remoteAddr  192.168.1.123:37088  close","time":"2019-05-15T14:21:20+08:00"}
{"level":"error","msg":"EOF remoteAddr  192.168.1.123:37098  close","time":"2019-05-15T14:23:06+08:00"}
{"level":"error","msg":"EOF remoteAddr  192.168.1.123:37146  close","time":"2019-05-15T14:25:19+08:00"}
{"level":"error","msg":"EOF remoteAddr  192.168.1.123:37244  close","time":"2019-05-15T14:31:28+08:00"}
{"level":"error","msg":"EOF remoteAddr  192.168.1.123:37370  close","time":"2019-05-15T14:32:20+08:00"}
{"level":"error","msg":"EOF remoteAddr  192.168.1.123:37374  close","time":"2019-05-15T14:33:17+08:00"}
log/info.log
New file
@@ -0,0 +1 @@
log/info.log.201905130000
log/info.log.201905130000
New file
Diff too large
log/log.go
New file
@@ -0,0 +1,48 @@
package log
import (
    "io/ioutil"
    "time"
    rotatelogs "github.com/lestrrat-go/file-rotatelogs"
    "github.com/rifflock/lfshook"
    "github.com/sirupsen/logrus"
)
var Log *logrus.Logger
func init() {
    Log = NewLogger()
}
func NewLogger() *logrus.Logger {
    if Log != nil {
        return Log
    }
    infopath := "log/info.log"
    infowriter, _ := rotatelogs.New(
        infopath+".%Y%m%d%H%M",
        rotatelogs.WithLinkName(infopath),
        rotatelogs.WithMaxAge(time.Duration(86400)*time.Second),
        rotatelogs.WithRotationTime(time.Duration(604800)*time.Second),
    )
    errorpath := "log/error.log"
    errorwriter, _ := rotatelogs.New(
        errorpath+".%Y%m%d%H%M",
        rotatelogs.WithLinkName(errorpath),
        rotatelogs.WithMaxAge(time.Duration(86400)*time.Second),
        rotatelogs.WithRotationTime(time.Duration(604800)*time.Second),
    )
    Log = logrus.New()
    Log.SetOutput(ioutil.Discard)
    Log.Hooks.Add(lfshook.NewHook(
        lfshook.WriterMap{
            logrus.InfoLevel:  infowriter,
            logrus.ErrorLevel: errorwriter,
        },
        &logrus.JSONFormatter{},
    ))
    return Log
}
pack/pack.go
New file
@@ -0,0 +1,41 @@
package pack
import (
    "encoding/binary"
    "fmt"
    "io"
)
type Package struct {
    Version [2]int8
    Datalen int64
    Data    []byte
}
func (p *Package) String() string {
    return fmt.Sprintf("Version:%d DataLen:%d Data:%s", p.Version, p.Datalen, p.Data)
}
func (p *Package) Pack(w io.Writer) {
    binary.Write(w, binary.BigEndian, p.Version)
    binary.Write(w, binary.BigEndian, p.Datalen)
    binary.Write(w, binary.BigEndian, p.Data)
}
func (p *Package) Unpack(r io.Reader) {
    binary.Read(r, binary.BigEndian, &p.Version)
    binary.Read(r, binary.BigEndian, &p.Datalen)
    if p.Datalen > 0 {
        p.Data = make([]byte, p.Datalen)
    }
    binary.Read(r, binary.BigEndian, &p.Data)
}
func BuildMsg(data []byte) Package {
    var pkg Package
    pkg.Version[0] = 'V'
    pkg.Version[1] = 1
    pkg.Data = data
    pkg.Datalen = int64(len(pkg.Data))
    return pkg
}
server.go
New file
@@ -0,0 +1,79 @@
package main
import (
    "flag"
    "net"
    "strconv"
    "time"
    "github.com/long/test/esutil"
    log "github.com/long/test/log"
)
var addr = flag.String("addr", "192.168.1.124", "The address to listen to;")
var Eurl = flag.String("eurl", "http://192.168.1.182:9200/", "The port to listen on; ")
var port = flag.Int("port", 6000, "The port to listen on; ")
var sec = flag.Int("sec", 10, "the second for query data. ")
func main() {
    flag.Parse()
    log.Log.Infoln("starting server...")
    src := *addr + ":" + strconv.Itoa(*port)
    listener, err := net.Listen("tcp", src)
    if err != nil {
        log.Log.Errorln(err)
        return
    }
    log.Log.Infof("Listening on %s.\n", src)
    defer listener.Close()
    for {
        conn, err := listener.Accept()
        if err != nil {
            log.Log.Errorf("some connecion error: %s\n", err)
        }
        go handleConnection(conn)
    }
}
func handleConnection(conn net.Conn) {
    remoteAddr := conn.RemoteAddr().String()
    log.Log.Infoln("Client connected from ", remoteAddr)
    ech := make(chan error)
    go func(conn net.Conn, ech chan error) {
        buf := make([]byte, 10)
        _, err := conn.Read(buf)
        if err != nil {
            ech <- err
        }
    }(conn, ech)
    tick := time.NewTicker(10 * time.Second)
    for {
        select {
        case <-tick.C:
            handleMessage(conn)
        case err := <-ech:
            log.Log.Errorln(err, "remoteAddr ", remoteAddr, " close")
            break
        }
    }
    log.Log.Infoln("Client at " + remoteAddr + " disconnected.")
}
func handleMessage(conn net.Conn) {
    jsonstring := esutil.PostAction(*sec, *Eurl)
    if jsonstring == nil {
        log.Log.Infoln("the data is nil")
        return
    }
    jsonstring = append(jsonstring, []byte("\000")...)
    log.Log.Infoln("jsonstring len: ", len(jsonstring), "\000 data: ", len("\000"))
    conn.Write(jsonstring)
}
test
Binary files differ