126 lines
2.7 KiB
Go
126 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"github.com/go-think/openssl"
|
|
"github.com/mitchellh/mapstructure"
|
|
"github.com/gorilla/websocket"
|
|
"log/slog"
|
|
"slgserver/net"
|
|
proto2 "slgserver/server/loginserver/proto"
|
|
"slgserver/util"
|
|
"time"
|
|
)
|
|
|
|
var origin = "httpserver://127.0.0.1:8002/"
|
|
var secretKey = []byte("")
|
|
var session = ""
|
|
|
|
func main() {
|
|
|
|
var dialer *websocket.Dialer
|
|
//通过Dialer连接websocket服务器
|
|
conn, _, err := dialer.Dial("ws://127.0.0.1:8001", nil)
|
|
if err != nil {
|
|
slog.Error("dial websocket failed", "error", err)
|
|
return
|
|
}
|
|
|
|
go do(conn)
|
|
go timeWriter(conn)
|
|
|
|
time.Sleep(10 * time.Second)
|
|
}
|
|
|
|
func do(conn *websocket.Conn) {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
slog.Error("do panic", "error", err)
|
|
}
|
|
}()
|
|
|
|
for {
|
|
_, message, _ := conn.ReadMessage()
|
|
msg := &net.RspBody{}
|
|
if len(secretKey) == 0 {
|
|
message, _ = util.UnZip(message)
|
|
if err := util.Unmarshal(message, msg); err == nil {
|
|
if msg.Name == "handshake" {
|
|
h := &net.Handshake{}
|
|
mapstructure.Decode(msg.Msg, h)
|
|
|
|
secretKey = []byte(h.Key)
|
|
}
|
|
slog.Info("received message", "name", msg.Name)
|
|
}
|
|
} else {
|
|
message, _ = util.UnZip(message)
|
|
data, err := util.AesCBCDecrypt(message, secretKey, secretKey, openssl.ZEROS_PADDING)
|
|
if err == nil {
|
|
if err := util.Unmarshal(data, msg); err == nil {
|
|
slog.Info("received message",
|
|
"name", msg.Name,
|
|
"code", msg.Code,
|
|
"payload", msg.Msg)
|
|
if msg.Name == "login" {
|
|
lr := &proto2.LoginRsp{}
|
|
mapstructure.Decode(msg.Msg, lr)
|
|
session = lr.Session
|
|
}
|
|
} else {
|
|
secretKey = []byte("")
|
|
}
|
|
} else {
|
|
secretKey = []byte("")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func login(conn *websocket.Conn) {
|
|
l := &proto2.LoginReq{Ip: "127.0.0.1", Username: "test", Password: "123456"}
|
|
send(conn, "login", l)
|
|
}
|
|
|
|
func reLogin(conn *websocket.Conn, session string) {
|
|
l := &proto2.ReLoginReq{Session: session}
|
|
slog.Info("relogin session", "session", session)
|
|
send(conn, "reLogin", l)
|
|
}
|
|
|
|
func logout(conn *websocket.Conn) {
|
|
l := &proto2.LogoutReq{UId: 5}
|
|
send(conn, "logout", l)
|
|
}
|
|
|
|
func send(conn *websocket.Conn, name string, dd interface{}) {
|
|
msg := &net.ReqBody{Name: name, Msg: dd}
|
|
|
|
if len(secretKey) == 0 {
|
|
|
|
} else {
|
|
if data, err := util.Marshal(msg); err == nil {
|
|
data, _ := util.AesCBCEncrypt(data, secretKey, secretKey, openssl.ZEROS_PADDING)
|
|
data, _ = util.Zip(data)
|
|
|
|
conn.WriteMessage(websocket.BinaryMessage, data)
|
|
}
|
|
}
|
|
}
|
|
|
|
func timeWriter(conn *websocket.Conn) {
|
|
|
|
time.Sleep(time.Second * 1)
|
|
login(conn)
|
|
|
|
time.Sleep(time.Second * 1)
|
|
reLogin(conn, session)
|
|
|
|
time.Sleep(20 * time.Second)
|
|
|
|
//time.Sleep(time.Second * 1)
|
|
//reLogin(conn, "123")
|
|
//
|
|
//time.Sleep(time.Second * 1)
|
|
//logout(conn)
|
|
}
|