diff --git a/builder/server b/builder/server deleted file mode 100755 index 69e7391..0000000 Binary files a/builder/server and /dev/null differ diff --git a/builder/wechat b/builder/wechat deleted file mode 100755 index 4549761..0000000 Binary files a/builder/wechat and /dev/null differ diff --git a/cmd/server/main.go b/cmd/server/main.go index 045e9f5..32b8d08 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -27,5 +27,7 @@ func main() { httpx.InitializeHttpServer(ctx, func(engine *gin.Engine) { r := engine.Group("ws") ws.Init(ctx, r, flags.Source()) + }, func(s *httpx.Server) { + s.Port = flags.Options.HttpPort }) } diff --git a/cmd/wechat/main.go b/cmd/wechat/main.go index 6ca333b..a606d35 100644 --- a/cmd/wechat/main.go +++ b/cmd/wechat/main.go @@ -13,50 +13,70 @@ package main import ( - "encoding/json" - "flag" + "fmt" "github.com/jageros/hawox/contextx" "github.com/jageros/hawox/wsc" "log" "net/http" - "os" + "unicode" "wechat/types" "wechat/view" ) func main() { - uid := flag.String("phone", "", "输入手机号码参数") - flag.Parse() - if *uid == "" { - log.Fatal("请携带手机号码参数启动,--phone=10086") - os.Exit(-1) - } ctx, cancel := contextx.Default() defer cancel() + var err error - h := http.Header{} - h.Add("uid", *uid) - + var sess *wsc.Session m := wsc.New(ctx) - sess, err := m.ConnectWithHeader("ws://127.0.0.1:8888/ws/wechat/1", h, map[string]interface{}{"uid": uid}) - if err != nil { - panic(err) - } + + view.OnMessage("请发送本人手机号码加入聊天室!\n") view.OnSendMsg(func(msg string) { - err = sess.Write([]byte(msg)) + if sess == nil { + if len(msg) != 11 { + view.OnMessage("手机号码格式错误!\n") + return + } + + for _, r := range msg { + if !unicode.Is(unicode.Number, r) { + view.OnMessage("手机号码格式错误!\n") + return + } + } + + uid := msg + h := http.Header{} + h.Add("uid", uid) + sess, err = m.ConnectWithHeader("ws://wechat.hawtech.cn/ws/wechat/1", h, map[string]interface{}{"uid": uid}) + if err != nil { + view.OnMessage(fmt.Sprintf("创建websocket链接错误,手机号码:%s 错误信息:%v\n", uid, err)) + return + } + view.OnMessage("登录成功!\n") + return + } + data := &types.Msg{ + MsgID: 1, + Msg: msg, + } + bytes, err := types.Marshal(data) if err != nil { - log.Println(err) + view.OnMessage(fmt.Sprintf("编码错误: %v", err)) + return + } + err = sess.WriteBinary(bytes) + if err != nil { + } }) m.HandleMessageBinary(func(session *wsc.Session, bytes []byte) { - //uid, _ := session.Get("uid") - //roomId, _ := session.Get("roomId") - msg := &types.Msg{} - err := json.Unmarshal(bytes, msg) + msg, err := types.Unmarshal(bytes) if err != nil { - log.Panicf("msg.Unmarshal err: %v", err) + view.OnMessage(fmt.Sprintf("解码错误:%v", err)) return } switch msg.MsgID { diff --git a/types/types.go b/types/types.go index d9f55b1..8332b04 100644 --- a/types/types.go +++ b/types/types.go @@ -12,8 +12,69 @@ package types +import ( + "encoding/json" + "math/rand" +) + type Msg struct { MsgID int `json:"msg_id"` Seq int64 `json:"seq"` Msg string `json:"msg"` } + +type pkg struct { + N int + V1 []byte + V2 []byte + V3 []byte +} + +func Marshal(msg *Msg) ([]byte, error) { + data, err := json.Marshal(msg) + if err != nil { + return nil, err + } + pk := &pkg{} + l := len(data) + for i := 0; i < l; i += 2 { + pk.N = 1 + pk.V1 = append(pk.V1, data[i]) + pk.V2 = append(pk.V2, uint8(rand.Intn(256))) + if i+1 < l { + pk.N = 2 + pk.V3 = append(pk.V3, data[i+1]) + } + } + return json.Marshal(pk) +} + +func Unmarshal(data []byte) (*Msg, error) { + var pk = &pkg{} + err := json.Unmarshal(data, pk) + if err != nil { + return nil, err + } + + var mds []byte + if pk.N == 1 { + l := len(pk.V3) + for i, v := range pk.V1 { + mds = append(mds, v) + if i < l { + mds = append(mds, pk.V3[i]) + } + } + } else { + l := len(pk.V1) + for i, v := range pk.V3 { + if i < l { + mds = append(mds, pk.V1[i]) + } + mds = append(mds, v) + } + } + res := &Msg{} + err = json.Unmarshal(mds, res) + return res, err +} diff --git a/ws/ws.go b/ws/ws.go index 4981642..8c35f5b 100644 --- a/ws/ws.go +++ b/ws/ws.go @@ -13,7 +13,6 @@ package ws import ( - "encoding/json" "fmt" "github.com/gin-gonic/gin" "github.com/jageros/hawox/contextx" @@ -53,7 +52,7 @@ func Init(ctx contextx.Context, r *gin.RouterGroup, relativePath string) { callTimeout: time.Second * 5, online: map[string]struct{}{}, } - ss.m.HandleMessage(ss.handleMessage) + ss.m.HandleMessageBinary(ss.handleMessage) ss.m.HandleConnect(ss.onConnect) ss.m.HandleDisconnect(ss.onDisconnect) r.GET(relativePath, ss.handler) @@ -106,8 +105,9 @@ func (s *service) updateOnline() { MsgID: 2, Msg: msg, } - bty, err := json.Marshal(resp) + bty, err := types.Marshal(resp) if err != nil { + logx.Errorf("编码错误:%v", err) return } err = s.m.BroadcastBinary(bty) @@ -120,7 +120,6 @@ func (s *service) updateOnline() { func (s *service) handleMessage(session *melody.Session, bytes []byte) { start := time.Now() uid, exist := session.Get("uid") - logx.Infof("on msg uid=%s", uid) if !exist { return } @@ -131,16 +130,23 @@ func (s *service) handleMessage(session *melody.Session, bytes []byte) { defer mux.Unlock() seq += 1 - msg := fmt.Sprintf("[%d]%s(%s): %s\n", seq, name, time.Now().Format("15:04:05"), string(bytes)) - - var resp = &types.Msg{ - MsgID: 1, - Msg: msg, + resp, err := types.Unmarshal(bytes) + if err != nil { + logx.Errorf("解码错误:%v", err) + return } - bty, err := json.Marshal(resp) + + msg := fmt.Sprintf("[%d]%s(%s): %s\n", seq, name, time.Now().Format("15:04:05"), resp.Msg) + resp.Msg = msg + resp.MsgID = 1 + resp.Seq = seq + + bty, err := types.Marshal(resp) if err != nil { + logx.Errorf("编码错误:%v", err) return } + err = s.m.BroadcastBinary(bty) if err != nil { logx.Error(err)