Exemplo n.º 1
0
    //向服务端发送数据包,也就是一个结构体对象
    public void SendMessage(uint mainId, uint assId, object obj = null)
    {
        //todo 这里要防止按钮的多次点击造成重新发送
        Sendpackage pkg = new Sendpackage();

        pkg.msgId     = mainId;
        pkg.assId     = assId;
        pkg.msgPackge = obj;
        lock (syncSendObj)
        {
            //登录协议去重
            if (mainId == 100 && assId == 1)
            {
                Sendpackage[] packegeArr = sendPackages.ToArray();
                for (int i = 0; i < packegeArr.Length; i++)
                {
                    if (packegeArr[i].msgId == pkg.msgId && packegeArr[i].assId == pkg.assId)
                    {
                        sendPackages.Clear();
                    }
                }
            }
            else //由于登录会在重连线程里所以登录协议的loading 另行处理
            {
                if (Application.internetReachability == NetworkReachability.NotReachable)
                {
                    msgSigal.Dispatch(new MsgPara("无法连接,请检查您的网络", 2));
                    return;
                }
            }
            sendPackages.Enqueue(pkg);
        }
    }
Exemplo n.º 2
0
    //向服务端发送数据包,也就是一个结构体对象
    public void SendMessage(uint mainId, uint assId, object obj = null)
    {
        //todo 这里要防止按钮的多次点击造成重新发送
        Sendpackage pkg = new Sendpackage();

        pkg.msgId     = mainId;
        pkg.assId     = assId;
        pkg.msgPackge = obj;
        lock (_syncSendObj)
        {
            //登录协议去重
            if (mainId == 100 && assId == 5)
            {
                Sendpackage[] packegeArr = sendPackages.ToArray();
                for (int i = 0; i < packegeArr.Length; i++)
                {
                    if (packegeArr[i].msgId == pkg.msgId && packegeArr[i].assId == pkg.assId)
                    {
                        sendPackages.Clear();
                    }
                }
            }
            else             //由于登录会在重连线程里所以登录协议的loading 另行处理
            {
                if (Application.internetReachability == NetworkReachability.NotReachable)
                {
                    EventMgr.ins.DispEvent("1000_02", null);                   //因为是主线程调用,所以可以正常使用
                    return;
                }
            }
            sendPackages.Enqueue(pkg);
        }
    }
Exemplo n.º 3
0
    //生成包头结构体
    private object GenerateHead(Sendpackage pkg)
    {
        NetMessageHead head = new NetMessageHead();

        head.uMessageSize = (uint)(Marshal.SizeOf(pkg.msgPackge) + HEADSIZE);
        head.bMainID      = pkg.msgId;
        head.bAssistantID = pkg.assId;
        //bReserve=7891 表示IOS发送,bReserve=7892表示安卓发送
                #if UNITY_ANDROID
        head.bReserve = 7892;
                #elif UNITY_IPHONE
        head.bReserve = 7891;
                #endif
        return(head);
    }
Exemplo n.º 4
0
    //按顺序发送数据包
    private void SendPkgQueue()
    {
        while (runSend)
        {
            if (clientSocket == null || !clientSocket.Connected)
            {
                Debug.Log("SendPkgQueue " + clientSocket.Connected);
                OnSocketProblem();
                break;
            }
            Thread.Sleep(200);
            if (sendPackages.Count > 0)
            {
                lock (syncSendObj)
                {
                    Sendpackage sendpkg = sendPackages.Peek();

                    if (sendpkg != null)
                    {
                        try
                        {
                            //Debug.Log("start send packege :" + sendpkg.msgId);
                            byte[] newByte = null;
                            if (sendpkg.msgPackge != null)  //有包体 包头
                            {
                                byte[] head = StructToBytes(GenerateHead(sendpkg));
                                //把结构体对象转换成数据包,也就是字节数组
                                object sendobj = sendpkg.msgPackge;
                                byte[] data    = StructToBytes(sendobj);
                                newByte = new byte[head.Length + data.Length];
                                Array.Copy(head, 0, newByte, 0, head.Length);
                                Array.Copy(data, 0, newByte, head.Length, data.Length);
                            }
                            else  //只有包头
                            {
                                NetMessageHead headObj = new NetMessageHead();
                                headObj.bMainID      = sendpkg.msgId;
                                headObj.uMessageSize = 20;
                                headObj.bAssistantID = sendpkg.assId;
                                headObj.bHandleCode  = 0;
                                //bReserve=7891 表示IOS发送,bReserve=7892表示安卓发送
                                                                #if UNITY_ANDROID
                                headObj.bReserve = 7892;
                                                                #elif UNITY_IPHONE
                                headObj.bReserve = 7891;
                                                                #endif
                                newByte = StructToBytes(headObj);
                            }
                            //计算出新的字节数组的长度
                            int length = newByte.Length;
                            //向服务端异步发送这个字节数组
                            clientSocket.SendTimeout = 5000;
                            int sendLength = clientSocket.Send(newByte, 0, length, SocketFlags.None);
                            if (sendLength < length)
                            {
                                clientSocket.Close();
                                Debug.LogError("sendLength<length !");
                                break;
                            }
                            sendPackages.Dequeue();
                        }
                        catch (Exception e)
                        {
                            OnSocketProblem();
                            Debug.Log("send message error: " + e);
                            break;
                        }
                    }
                    else
                    {
                        sendPackages.Dequeue();
                    }
                }
            }
        }
    }
Exemplo n.º 5
0
    //按顺序发送数据包
    public void SendPkgQueue()
    {
        if (!runSend)
        {
            return;
        }

        if (gameSocket == null || !gameSocket.Connected)
        {
            Debug.Log("Game SendPkgQueue " + gameSocket.Connected + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"));
            OnSocketProblem();
            return;
        }

        if (sendPackages.Count > 0)
        {
            lock (_syncSendObj)
            {
                Sendpackage sendpkg = sendPackages.Peek();
                if (sendpkg != null)
                {
                    try
                    {
                        Debug.Log("Game start send packege mainId:" + sendpkg.msgId + " assId:" + sendpkg.assId);
                        byte[] newByte = null;
                        if (sendpkg.msgPackge != null)  //有包体 包头
                        {
                            byte[] head = LoSocket.StructToBytes(GenerateHead(sendpkg));
                            //把结构体对象转换成数据包,也就是字节数组
                            object sendobj = sendpkg.msgPackge;
                            byte[] data    = LoSocket.StructToBytes(sendobj);

                            newByte = new byte[head.Length + data.Length];
                            Array.Copy(head, 0, newByte, 0, head.Length);
                            Array.Copy(data, 0, newByte, head.Length, data.Length);
                        }
                        else  //只有包头
                        {
                            NetMessageHead headObj = new NetMessageHead();
                            headObj.bMainID      = sendpkg.msgId;
                            headObj.uMessageSize = 20;
                            headObj.bAssistantID = sendpkg.assId;
                            headObj.bHandleCode  = 0;
                            //bReserve=7891 表示IOS发送,bReserve=7892表示安卓发送
                                                        #if UNITY_ANDROID
                            headObj.bReserve = 7892;
                                                        #elif UNITY_IPHONE
                            headObj.bReserve = 7891;
                                                        #endif
                            newByte = LoSocket.StructToBytes(headObj);
                        }
                        //计算出新的字节数组的长度
                        int length = newByte.Length;

                        //向服务端异步发送这个字节数组
                        gameSocket.SendTimeout = 5000;
                        int sendLength = gameSocket.Send(newByte, 0, length, SocketFlags.None);

                        if (sendLength < length)
                        {
                            gameSocket.Close();
                            Debug.LogError("Game sendLength<length !");
                            return;
                        }
                        sendPackages.Dequeue();
                    }
                    catch (Exception e)
                    {
                        OnSocketProblem();
                        Debug.Log("Game send message error: " + e);
                        return;
                    }
                }
                else
                {
                    sendPackages.Dequeue();
                }
            }
        }
    }