|
|
@@ -7,21 +7,22 @@ import (
|
|
|
"encoding/hex"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
+ "net"
|
|
|
+ "strconv"
|
|
|
+ "time"
|
|
|
+
|
|
|
"git.qianqiusoft.com/library/glog"
|
|
|
"git.qianqiusoft.com/qianqiusoft/light-apiengine/config"
|
|
|
"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
|
|
|
sysutils "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
|
|
|
- "net"
|
|
|
- "strconv"
|
|
|
- "time"
|
|
|
)
|
|
|
|
|
|
const (
|
|
|
__KEY = "Light#dauth-@*I2"
|
|
|
|
|
|
- CMD_NEW = "new"
|
|
|
- CMD_REMOVE = "remove"
|
|
|
- CMD_PINGPONG = "pg"
|
|
|
+ CMD_NEW = "new"
|
|
|
+ CMD_REMOVE = "remove"
|
|
|
+ CMD_PINGPONG = "pg"
|
|
|
CMD_PINGPONG_RESP = "pg_resp"
|
|
|
)
|
|
|
|
|
|
@@ -33,7 +34,7 @@ type authPackage struct {
|
|
|
Content []byte
|
|
|
}
|
|
|
|
|
|
-func (ap *authPackage)toBytes()[]byte{
|
|
|
+func (ap *authPackage) toBytes() []byte {
|
|
|
buf := bytes.NewBuffer([]byte{})
|
|
|
|
|
|
b := []byte(ap.Cmd)
|
|
|
@@ -47,32 +48,32 @@ func (ap *authPackage)toBytes()[]byte{
|
|
|
}
|
|
|
|
|
|
type TcpClient struct {
|
|
|
- conn net.Conn // 连接
|
|
|
- pchan chan *authPackage // 包chan
|
|
|
- done chan bool // 是否done
|
|
|
- exited bool // 退出
|
|
|
- verified bool // 验证是否
|
|
|
+ conn net.Conn // 连接
|
|
|
+ pchan chan *authPackage // 包chan
|
|
|
+ done chan bool // 是否done
|
|
|
+ exited bool // 退出
|
|
|
+ verified bool // 验证是否
|
|
|
}
|
|
|
|
|
|
// 创建client
|
|
|
-func NewTcpClient()*TcpClient{
|
|
|
+func NewTcpClient() *TcpClient {
|
|
|
c := &TcpClient{
|
|
|
- pchan: make(chan *authPackage, 100),
|
|
|
- done: make(chan bool),
|
|
|
- exited: false,
|
|
|
+ pchan: make(chan *authPackage, 100),
|
|
|
+ done: make(chan bool),
|
|
|
+ exited: false,
|
|
|
verified: false,
|
|
|
}
|
|
|
return c
|
|
|
}
|
|
|
|
|
|
// 启动
|
|
|
-func(c *TcpClient)Start() {
|
|
|
+func (c *TcpClient) Start() {
|
|
|
go func() {
|
|
|
defer func() {
|
|
|
if p := recover(); p != nil {
|
|
|
fmt.Println("ecover", p)
|
|
|
}
|
|
|
- if c.conn != nil{
|
|
|
+ if c.conn != nil {
|
|
|
c.conn.Close()
|
|
|
}
|
|
|
c.restart()
|
|
|
@@ -96,7 +97,7 @@ func(c *TcpClient)Start() {
|
|
|
fmt.Println("Error dialing", err.Error())
|
|
|
return
|
|
|
}
|
|
|
- if vresp != "ok"{
|
|
|
+ if vresp != "ok" {
|
|
|
// 验证失败
|
|
|
fmt.Println("verify is not ok", vresp)
|
|
|
return
|
|
|
@@ -131,17 +132,17 @@ func(c *TcpClient)Start() {
|
|
|
fmt.Println("读取命令错误", err.Error())
|
|
|
break
|
|
|
}
|
|
|
- if cmd == CMD_NEW{
|
|
|
+ if cmd == CMD_NEW {
|
|
|
err = c.newHandler()
|
|
|
- } else if cmd == CMD_REMOVE{
|
|
|
+ } else if cmd == CMD_REMOVE {
|
|
|
err = c.removeHandler()
|
|
|
- } else if cmd == CMD_PINGPONG_RESP{
|
|
|
+ } else if cmd == CMD_PINGPONG_RESP {
|
|
|
|
|
|
} else {
|
|
|
fmt.Println("未知cmd", cmd)
|
|
|
continue
|
|
|
}
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
c.done <- true
|
|
|
fmt.Println("处理错误", err.Error())
|
|
|
break
|
|
|
@@ -151,19 +152,19 @@ func(c *TcpClient)Start() {
|
|
|
}
|
|
|
|
|
|
// 停止
|
|
|
-func(c *TcpClient)Stop(){
|
|
|
+func (c *TcpClient) Stop() {
|
|
|
c.exited = true
|
|
|
c.conn.Close()
|
|
|
}
|
|
|
|
|
|
// 检测
|
|
|
-func(c *TcpClient)restart(){
|
|
|
- if c.exited{
|
|
|
+func (c *TcpClient) restart() {
|
|
|
+ if c.exited {
|
|
|
// 已退出则不重启
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- go func(){
|
|
|
+ go func() {
|
|
|
c.verified = false
|
|
|
c.done = make(chan bool)
|
|
|
c.pchan = make(chan *authPackage, 100)
|
|
|
@@ -174,30 +175,30 @@ func(c *TcpClient)restart(){
|
|
|
}
|
|
|
|
|
|
// 发送bytes
|
|
|
-func(c *TcpClient)Send(cmd string, bytess []byte){
|
|
|
- if !c.verified{
|
|
|
+func (c *TcpClient) Send(cmd string, bytess []byte) {
|
|
|
+ if !c.verified {
|
|
|
fmt.Println("未认证")
|
|
|
return
|
|
|
}
|
|
|
|
|
|
glog.Infoln("发送指令1", cmd)
|
|
|
c.pchan <- &authPackage{
|
|
|
- Cmd: cmd,
|
|
|
+ Cmd: cmd,
|
|
|
Content: bytess,
|
|
|
}
|
|
|
glog.Infoln("发送指令2", cmd)
|
|
|
}
|
|
|
|
|
|
// 发送token
|
|
|
-func(c *TcpClient)SendToken(token *entitys.Token){
|
|
|
- glog.Infoln("发送新建token")
|
|
|
+func (c *TcpClient) SendToken(token *entitys.Token) {
|
|
|
+ // glog.Infoln("发送新建token")
|
|
|
bytess := tokenToBytes(token)
|
|
|
c.Send(CMD_NEW, bytess)
|
|
|
}
|
|
|
|
|
|
// 处理创建
|
|
|
-func(c *TcpClient)newHandler()error{
|
|
|
- fmt.Println("处理新建")
|
|
|
+func (c *TcpClient) newHandler() error {
|
|
|
+ // fmt.Println("处理新建")
|
|
|
bytess, err := readBytes(c.conn)
|
|
|
if err != nil {
|
|
|
fmt.Println("读取token内容错误", err.Error())
|
|
|
@@ -205,7 +206,7 @@ func(c *TcpClient)newHandler()error{
|
|
|
}
|
|
|
// 新建
|
|
|
token, err := bytesToToken(bytess)
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
glog.Infoln("bytesToToken 错误", err.Error())
|
|
|
return err
|
|
|
}
|
|
|
@@ -214,7 +215,7 @@ func(c *TcpClient)newHandler()error{
|
|
|
}
|
|
|
|
|
|
// 处理删除
|
|
|
-func(c *TcpClient)removeHandler()error{
|
|
|
+func (c *TcpClient) removeHandler() error {
|
|
|
fmt.Println("处理删除")
|
|
|
bytess, err := readBytes(c.conn)
|
|
|
if err != nil {
|
|
|
@@ -227,10 +228,10 @@ func(c *TcpClient)removeHandler()error{
|
|
|
}
|
|
|
|
|
|
// 读取字符串
|
|
|
-func readString(conn net.Conn)(string, error){
|
|
|
+func readString(conn net.Conn) (string, error) {
|
|
|
// 读长度
|
|
|
size, err := readUInt32(conn)
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("读取长度失败,", err.Error())
|
|
|
return "", err
|
|
|
}
|
|
|
@@ -238,15 +239,15 @@ func readString(conn net.Conn)(string, error){
|
|
|
// 读字符串
|
|
|
b := make([]byte, size)
|
|
|
n, err := conn.Read(b)
|
|
|
- if n != int(size){
|
|
|
+ if n != int(size) {
|
|
|
return "", errors.New("读取长度不是" + strconv.Itoa(int(size)))
|
|
|
}
|
|
|
return string(b), nil
|
|
|
}
|
|
|
|
|
|
// 写入字符串
|
|
|
-func writeString(conn net.Conn, str string)error{
|
|
|
- if str == ""{
|
|
|
+func writeString(conn net.Conn, str string) error {
|
|
|
+ if str == "" {
|
|
|
return errors.New("字符串为空")
|
|
|
}
|
|
|
|
|
|
@@ -255,18 +256,18 @@ func writeString(conn net.Conn, str string)error{
|
|
|
|
|
|
// 发送长度
|
|
|
err := writeUInt32(conn, uint32(size))
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("发送长度失败,", err.Error())
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
// 发送内容
|
|
|
n, err := conn.Write(bytess)
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("发送内容失败,", err.Error())
|
|
|
return err
|
|
|
}
|
|
|
- if n != size{
|
|
|
+ if n != size {
|
|
|
return errors.New("发送长度不是" + strconv.Itoa(int(size)))
|
|
|
}
|
|
|
|
|
|
@@ -274,10 +275,10 @@ func writeString(conn net.Conn, str string)error{
|
|
|
}
|
|
|
|
|
|
// 读取bytes
|
|
|
-func readBytes(conn net.Conn)([]byte, error){
|
|
|
+func readBytes(conn net.Conn) ([]byte, error) {
|
|
|
// 读长度
|
|
|
size, err := readUInt32(conn)
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("读取长度失败,", err.Error())
|
|
|
return nil, err
|
|
|
}
|
|
|
@@ -285,21 +286,21 @@ func readBytes(conn net.Conn)([]byte, error){
|
|
|
// 读字符串
|
|
|
b := make([]byte, size)
|
|
|
n, err := conn.Read(b)
|
|
|
- if n != int(size){
|
|
|
+ if n != int(size) {
|
|
|
return nil, errors.New("读取长度不是" + strconv.Itoa(int(size)))
|
|
|
}
|
|
|
return b, nil
|
|
|
}
|
|
|
|
|
|
// 读取uint64
|
|
|
-func readUInt32(conn net.Conn)(uint32, error){
|
|
|
+func readUInt32(conn net.Conn) (uint32, error) {
|
|
|
b := make([]byte, 4)
|
|
|
n, err := conn.Read(b)
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("读取长度失败,", err.Error())
|
|
|
return 0, err
|
|
|
}
|
|
|
- if n != 4{
|
|
|
+ if n != 4 {
|
|
|
return 0, errors.New("读取长度不是4")
|
|
|
}
|
|
|
size := binary.BigEndian.Uint32(b)
|
|
|
@@ -308,49 +309,47 @@ func readUInt32(conn net.Conn)(uint32, error){
|
|
|
}
|
|
|
|
|
|
// 写入长度
|
|
|
-func writeUInt32(conn net.Conn, v uint32)error{
|
|
|
+func writeUInt32(conn net.Conn, v uint32) error {
|
|
|
// 发送长度
|
|
|
b := make([]byte, 4)
|
|
|
binary.BigEndian.PutUint32(b, v)
|
|
|
n, err := conn.Write(b)
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("发送长度失败,", err.Error())
|
|
|
return err
|
|
|
}
|
|
|
- if n != 4{
|
|
|
+ if n != 4 {
|
|
|
return errors.New("发送长度不是4")
|
|
|
}
|
|
|
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-
|
|
|
// 写入长度
|
|
|
-func writeUInt64(conn net.Conn, v uint64)error{
|
|
|
+func writeUInt64(conn net.Conn, v uint64) error {
|
|
|
// 发送长度
|
|
|
b := make([]byte, 8)
|
|
|
binary.BigEndian.PutUint64(b, v)
|
|
|
n, err := conn.Write(b)
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("发送长度失败,", err.Error())
|
|
|
return err
|
|
|
}
|
|
|
- if n != 4{
|
|
|
+ if n != 4 {
|
|
|
return errors.New("发送长度不是4")
|
|
|
}
|
|
|
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-
|
|
|
// 读取uint64
|
|
|
-func readStringByBytes(bytess []byte)(string, int, error) {
|
|
|
+func readStringByBytes(bytess []byte) (string, int, error) {
|
|
|
size := binary.BigEndian.Uint32(bytess)
|
|
|
return string(bytess[4 : 4+size]), int(size), nil
|
|
|
}
|
|
|
|
|
|
// int转bytes
|
|
|
-func uint32ToBytes(v int)[]byte{
|
|
|
+func uint32ToBytes(v int) []byte {
|
|
|
b := make([]byte, 4)
|
|
|
binary.BigEndian.PutUint32(b, uint32(v))
|
|
|
|
|
|
@@ -358,7 +357,7 @@ func uint32ToBytes(v int)[]byte{
|
|
|
}
|
|
|
|
|
|
// int转bytes
|
|
|
-func uint64ToBytes(v int)[]byte{
|
|
|
+func uint64ToBytes(v int) []byte {
|
|
|
b := make([]byte, 8)
|
|
|
binary.BigEndian.PutUint32(b, uint32(v))
|
|
|
|
|
|
@@ -366,68 +365,68 @@ func uint64ToBytes(v int)[]byte{
|
|
|
}
|
|
|
|
|
|
// 转token
|
|
|
-func bytesToToken(content []byte)(*entitys.Token, error){
|
|
|
+func bytesToToken(content []byte) (*entitys.Token, error) {
|
|
|
token := &entitys.Token{}
|
|
|
var index int = 0
|
|
|
var size int
|
|
|
var err error = nil
|
|
|
- fmt.Println("读取userid")
|
|
|
+ // fmt.Println("读取userid")
|
|
|
token.UserId, size, err = readStringByBytes(content)
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("读取userid错误")
|
|
|
- return nil, err
|
|
|
+ return nil, err
|
|
|
}
|
|
|
index += 4 + size
|
|
|
|
|
|
- fmt.Println("读取AccessToken")
|
|
|
+ // fmt.Println("读取AccessToken")
|
|
|
token.AccessToken, size, err = readStringByBytes(content[index:])
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("读取AccessToken错误")
|
|
|
- return nil, err
|
|
|
+ return nil, err
|
|
|
}
|
|
|
index += 4 + size
|
|
|
|
|
|
- fmt.Println("读取RefreshToken")
|
|
|
+ // fmt.Println("读取RefreshToken")
|
|
|
token.RefreshToken, size, err = readStringByBytes(content[index:])
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("读取RefreshToken错误")
|
|
|
- return nil, err
|
|
|
+ return nil, err
|
|
|
}
|
|
|
index += 4 + size
|
|
|
|
|
|
- fmt.Println("读取LoginID")
|
|
|
+ // fmt.Println("读取LoginID")
|
|
|
token.LoginID, size, err = readStringByBytes(content[index:])
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("读取LoginID错误")
|
|
|
- return nil, err
|
|
|
+ return nil, err
|
|
|
}
|
|
|
index += 4 + size
|
|
|
|
|
|
- fmt.Println("读取timestamp")
|
|
|
+ // fmt.Println("读取timestamp")
|
|
|
token.TimeStamp = binary.BigEndian.Uint64(content[index:])
|
|
|
index += 8
|
|
|
|
|
|
- fmt.Println("读取ServerIp")
|
|
|
+ // fmt.Println("读取ServerIp")
|
|
|
token.ServerIp, size, err = readStringByBytes(content[index:])
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("读取ServerIp错误")
|
|
|
- return nil, err
|
|
|
+ return nil, err
|
|
|
}
|
|
|
index += 4 + size
|
|
|
|
|
|
- fmt.Println("读取Domain")
|
|
|
+ // fmt.Println("读取Domain")
|
|
|
token.Domain, size, err = readStringByBytes(content[index:])
|
|
|
- if err != nil{
|
|
|
+ if err != nil {
|
|
|
fmt.Println("读取Domain错误")
|
|
|
- return nil, err
|
|
|
+ return nil, err
|
|
|
}
|
|
|
index += 4 + size
|
|
|
|
|
|
- return token, nil
|
|
|
+ return token, nil
|
|
|
}
|
|
|
|
|
|
// 转bytes,包括token开头
|
|
|
-func tokenToBytes(token *entitys.Token)[]byte{
|
|
|
+func tokenToBytes(token *entitys.Token) []byte {
|
|
|
buf := bytes.NewBuffer([]byte{})
|
|
|
|
|
|
t := []byte(token.UserId)
|
|
|
@@ -459,7 +458,7 @@ func tokenToBytes(token *entitys.Token)[]byte{
|
|
|
buf.Write(t)
|
|
|
|
|
|
bytess := buf.Bytes()
|
|
|
- buf = bytes.NewBuffer([]byte{}) // 这里用reset是错误的
|
|
|
+ buf = bytes.NewBuffer([]byte{}) // 这里用reset是错误的
|
|
|
|
|
|
tokenstrbytes := []byte(token.AccessToken)
|
|
|
buf.Write(uint32ToBytes(len(tokenstrbytes)))
|
|
|
@@ -471,7 +470,7 @@ func tokenToBytes(token *entitys.Token)[]byte{
|
|
|
}
|
|
|
|
|
|
// 发送验证
|
|
|
-func sendVerify(conn net.Conn){
|
|
|
+func sendVerify(conn net.Conn) {
|
|
|
timestamp := time.Now().UnixNano()
|
|
|
timestampStr := strconv.Itoa(int(timestamp))
|
|
|
seed := timestampStr + __KEY
|
|
|
@@ -482,7 +481,7 @@ func sendVerify(conn net.Conn){
|
|
|
}
|
|
|
|
|
|
// md5 哈希
|
|
|
-func hash(str string)string{
|
|
|
+func hash(str string) string {
|
|
|
h := md5.New()
|
|
|
h.Write([]byte(str))
|
|
|
return hex.EncodeToString(h.Sum(nil))
|