加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

没事随便写个小东西,虽然不知道想做啥,先留着

发布时间:2020-12-16 18:35:19 所属栏目:大数据 来源:网络整理
导读:package mainimport ("bufio""encoding/json""fmt""net""strings""sync""time")func smain() {con,err := net.Dial("tcp","127.0.0.1:1789")if err != nil {fmt.Println(err)return}var x Msg = Msg{Action: "script",Address: "http://127.0.0.1"}b,_:=json
package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"net"
	"strings"
	"sync"
	"time"
)

func smain() {
	con,err := net.Dial("tcp","127.0.0.1:1789")
	if err != nil {
		fmt.Println(err)
		return
	}
	var x Msg = Msg{Action: "script",Address: "http://127.0.0.1"}
	b,_:=json.Marshal(x)
	con.Write(b)
	fmt.Fprint(con,"rn")
	buf := make([]byte,100)
	n,_ := con.Read(buf)
	json.Unmarshal(buf[:n],&x)
	fmt.Println(x)
	fmt.Println(string(buf[:n]))

}
func main() {
	lis,err := net.Listen("tcp","0.0.0.0:1789")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer lis.Close()
	for {
		con,err := lis.Accept()
		if err != nil {
			fmt.Println(err)
			continue
		}
		go Hander(con)
	}
}

type Msg struct {
	Action  string `json:action`
	Address string `json:address`
	JobID   int64  `json:jobid`
	Remark  string `json:remark`
}

var empty []byte

func Hander(con net.Conn) {
	defer con.Close()
	ip := strings.Split(con.RemoteAddr().String(),":")[0]
	if !statusMap.Add(ip) {
		fmt.Fprint(con,"Already existrn")
		return
	}
	buf := getBufPool(con)
	defer putBufPool(buf)
	for {
		line,_,err := buf.ReadLine()
		if err != nil {
			break
		}
		msg,err := decode(line)
		if err != nil {
			fmt.Fprint(con,"Unknow typern")
			putJsonPool(msg)
			continue
		}
		if b,err := handlerMsg(msg); err != nil {
			fmt.Fprint(con,"Can't execute this job.")
			putJsonPool(msg)
			continue
		} else {
			con.Write(b)
		}
		putJsonPool(msg)
	}
}
func handlerMsg(msg *Msg) ([]byte,error) {
	msg.JobID = NewID()
	b,err := encode(msg)
	if err != nil {
		return empty,err
	}
	//执行对应操作
	return b,nil
}

func handmsg(b []byte,ip string) {
	switch string(b) {
	case "Test.Ping":
		statusMap[ip] = getNow()
	}
}

type statusM map[string]int64

var statusMap statusM = make(statusM)

func (statusM) Flush(ip string) {
	statusMap[ip] = getNow()
}

func (statusM) Del(ip string) {
	delete(statusMap,ip)
}

func (statusM) Add(ip string) bool {
	_,ok := statusMap[ip]
	if ok {
		return false
	}
	statusMap.Flush(ip)
	return true
}

var Pool sync.Pool

func getBufPool(con net.Conn) *bufio.Reader {
	buf := Pool.Get()
	b,ok := buf.(*bufio.Reader)
	if ok {
		b.Reset(con)
		return b
	}
	return bufio.NewReader(con)
}

func putBufPool(b *bufio.Reader) {
	b.Reset(nil)
	Pool.Put(b)
}

var GlobalLock sync.Mutex

func NewID() int64 {
	GlobalLock.Lock()
	defer GlobalLock.Unlock()
	time.Sleep(1e9)
	return getNow()
}

func getNow() int64 {
	return time.Now().Unix()
}

func decode(b []byte) (*Msg,error) {
	fmt.Print(string(b))
	j := getJsonPool()
	err := json.Unmarshal(b,j)
	if err != nil {
		return nil,err
	}
	return j,nil
}
func encode(msg *Msg) ([]byte,error) {
	return json.Marshal(*msg)
}

var JsonPool sync.Pool

func getJsonPool() *Msg {
	buf := Pool.Get()
	b,ok := buf.(*Msg)
	if ok {
		return b
	}
	return new(Msg)
}

func putJsonPool(m *Msg) {
	m = nil
	Pool.Put(m)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读