first commit
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
package mmtls
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"xiawan/wx/clientsdk/baseutils"
|
||||
)
|
||||
|
||||
// MMLongConnect 链接MMtls服务器
|
||||
func MMLongConnect(mmInfo *MMInfo) error {
|
||||
strPort := strconv.Itoa(int(mmInfo.LONGPort))
|
||||
serverAddr := mmInfo.LongHost + ":" + strPort
|
||||
fmt.Println("MMLongConnect serverAddr: ", serverAddr)
|
||||
mminfoDialer := "0"
|
||||
if mmInfo.Dialer != nil {
|
||||
mminfoDialer = "1"
|
||||
}
|
||||
// 打印 mmInfo.Dialer
|
||||
fmt.Println("MMLongConnect mmInfo.Dialer: ", mminfoDialer)
|
||||
// 定义
|
||||
var conn net.Conn
|
||||
var err error
|
||||
for i := 0; i < 30; i++ {
|
||||
if mmInfo.Dialer != nil {
|
||||
conn, err = mmInfo.Dialer.Dial("tcp4", serverAddr)
|
||||
if err != nil {
|
||||
baseutils.PrintLog(fmt.Sprintf("MMLongConnect attempt %d failed: %s", i+1, err.Error()))
|
||||
// 等待 500 毫秒重时 (最大 30 次)
|
||||
time.Sleep(500 * time.Millisecond)
|
||||
continue
|
||||
}
|
||||
mmInfo.Conn = conn
|
||||
mmInfo.reader = bufio.NewReader(conn)
|
||||
fmt.Println("MMLongConnect success!")
|
||||
return nil
|
||||
}
|
||||
|
||||
// 没有使用代理
|
||||
conn, err = net.Dial("tcp4", serverAddr)
|
||||
if err != nil {
|
||||
baseutils.PrintLog(fmt.Sprintf("MMLongConnect attempt %d failed: %s", i+1, err.Error()))
|
||||
// 等待 500 毫秒重时 (最大 30 次)
|
||||
time.Sleep(500 * time.Millisecond)
|
||||
continue
|
||||
}
|
||||
mmInfo.Conn = conn
|
||||
mmInfo.reader = bufio.NewReader(conn)
|
||||
return nil
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// MMTCPSendData MMTCPSendData 长链接发送数据
|
||||
func MMTCPSendData(mmInfo *MMInfo, data []byte) error {
|
||||
// 连接服务器
|
||||
if mmInfo.Conn == nil {
|
||||
// 提前设置好长链接Host Port
|
||||
err := MMLongConnect(mmInfo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// 发送数据
|
||||
length, err := mmInfo.Conn.Write(data)
|
||||
// 判断是否出错
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 判断数据是否发送完毕
|
||||
if length != len(data) {
|
||||
return errors.New("MMTCPSendData err: length != len(data)")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// MMTCPRecvItems 循环接收长链接数据
|
||||
// Deprecated
|
||||
func MMTCPRecvItems(mmInfo *MMInfo) ([]*PackItem, error) {
|
||||
// 接收返回数据
|
||||
recvBuf := make([]byte, 10240)
|
||||
recvLen, err := mmInfo.Conn.Read(recvBuf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
retData := recvBuf[0:recvLen]
|
||||
retItems, err := ParserMMtlsResponseData(retData)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return retItems, nil
|
||||
}
|
||||
|
||||
// MMTCPRecvOneItem
|
||||
func MMTCPRecvOneItem(mmInfo *MMInfo) (*PackItem, error) {
|
||||
if mmInfo == nil || mmInfo.Conn == nil || mmInfo.reader == nil {
|
||||
return nil, errors.New("mmInfo.Conn or mmInfo.reader is nil")
|
||||
}
|
||||
|
||||
// 读取头部数据
|
||||
recordHeadData := make([]byte, 5)
|
||||
if _, err := io.ReadFull(mmInfo.reader, recordHeadData); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 读取Content
|
||||
recordHead := RecordHeadDeSerialize(recordHeadData)
|
||||
bodyData := make([]byte, recordHead.Size)
|
||||
if _, err := io.ReadFull(mmInfo.reader, bodyData); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &PackItem{
|
||||
RecordHead: recordHeadData,
|
||||
PackData: bodyData,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// MMTCPSendReq 长链接发送请求
|
||||
func MMTCPSendReq(mmInfo *MMInfo, opCode uint32, data []byte) error {
|
||||
sendData, err := MMLongPackData(mmInfo, opCode, data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 发送数据
|
||||
err = MMTCPSendData(mmInfo, sendData)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// MMTCPRecvData 接受MMTLS信息
|
||||
func MMTCPRecvData(mmInfo *MMInfo) (*LongRecvInfo, error) {
|
||||
// 接收响应数据
|
||||
recvItem, err := MMTCPRecvOneItem(mmInfo)
|
||||
if err != nil {
|
||||
fmt.Println("MMTCPRecvData err", err.Error())
|
||||
// log.("接收mmtls长链接响应失败", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 解包响应数据
|
||||
recvInfo, err := MMLongUnPackData(mmInfo, recvItem)
|
||||
if err != nil {
|
||||
fmt.Println("MMTCPRecvData err", err.Error())
|
||||
//log.Info("解包响应数据失败", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return recvInfo, nil
|
||||
}
|
||||
Reference in New Issue
Block a user