Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了没事随便写个小东西,虽然不知道想做啥,先留着大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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,"\r\n")
	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 exist\r\n")
		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 type\r\n")
			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)
}

大佬总结

以上是大佬教程为你收集整理的没事随便写个小东西,虽然不知道想做啥,先留着全部内容,希望文章能够帮你解决没事随便写个小东西,虽然不知道想做啥,先留着所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。