示例#1
0
    void SplitePackage()
    {
        int header_len = 0;

        byte[] package;
        byte[] data_package = Recv_Long_Byte == null ? Recv_Byte : Recv_Long_Byte;
        while (recv_data_len > 0)
        {
            package = TcpPacker.UnPackage(data_package, out header_len);
            if (package == null)//接受数据不足,继续接收
            {
                break;
            }
            Recv_Server_Data(package);
            if (recv_data_len > header_len)//多余一个包
            {
                byte[] tempArray = new byte[Max_Data_Len];
                Array.Copy(data_package, header_len, tempArray, 0, recv_data_len - header_len);
                data_package = tempArray;
            }

            recv_data_len -= header_len;

            if (recv_data_len == 0 && Recv_Long_Byte != null)
            {
                Recv_Long_Byte = null;
                Long_Data_Size = 0;
            }
        }
    }
    private void RecvData(int len, byte[] buf)
    {
        if (TcpPacker.ReadHeader(buf, len, out pkgSize))
        {
            if (pkgSize > len)
            {
                rawBuffer = new byte[pkgSize];
                Array.Copy(buf, 0, rawBuffer, 0, len);
                clientSocket.Receive(rawBuffer, len, pkgSize - len, SocketFlags.None);
                OnRecvClientCmd(rawBuffer, pkgSize);


                pkgSize    = 0;
                recvBuffer = null;
                rawBuffer  = null;
                return;
            }

            OnRecvClientCmd(buf, pkgSize);

            len -= pkgSize;
            int recved = 0;
            while (len > 0)
            {
                recved   += pkgSize;
                pkgSize   = DataView.ReadUintLe(buf, pkgSize, 2);
                rawBuffer = new byte[pkgSize];
                Array.Copy(buf, recved, rawBuffer, 0, pkgSize);
                OnRecvClientCmd(rawBuffer, pkgSize);
                len -= pkgSize;
            }
        }
    }
示例#3
0
 public void send_proto_msg_to_client(int stype, int ctype, ProtoBuf.IExtensible msg)
 {
     Protocol_type = Protocol_Type.protocol_protobuf;
     byte[] send_bytes  = EncodeCmd.Encode_Protobuf(stype, ctype, msg);
     byte[] tcp_package = TcpPacker.Package(send_bytes);
     this.client_socket.BeginSend(tcp_package, 0, tcp_package.Length, SocketFlags.None, new AsyncCallback(this.on_send_data), this.client_socket);
 }
示例#4
0
    void Recv_Data()
    {
        int read_len = 0;

        while (true)
        {
            if (!client_socket.Connected)
            {
                break;
            }
            try
            {
                if (recv_data_len < Max_Data_Len)//收的数据小于范围
                {
                    read_len = client_socket.Receive(Recv_Byte, recv_data_len, Recv_Byte.Length - recv_data_len, SocketFlags.None);
                }
                else
                {
                    if (Recv_Long_Byte == null)
                    {
                        int pkg_size;
                        TcpPacker.UnPackage(Recv_Byte, out pkg_size);
                        Long_Data_Size = pkg_size;
                        Recv_Long_Byte = new byte[Long_Data_Size];
                        Array.Copy(Recv_Byte, Recv_Long_Byte, Recv_Byte.Length);
                    }
                    read_len = client_socket.Receive(Recv_Long_Byte, recv_data_len, Recv_Long_Byte.Length - recv_data_len, SocketFlags.None);
                }
                recv_data_len += read_len;

                SplitePackage();
            }
            catch (Exception e)//服务器主动关闭连接
            {
                Debug.Log(e.ToString());
                client_socket.Disconnect(true);
                client_socket.Shutdown(SocketShutdown.Both);
                client_socket.Close();
                //Recv_Thread.Abort();
                break;
            }
        }
    }
    void SendJsonCmd(int stype, int ctype, string jsonBody)
    {
        byte[] cmdData = ProtoMan.PackJsonCmd(stype, ctype, jsonBody);
        if (cmdData == null)
        {
            return;
        }
        byte[] tcpPkg = TcpPacker.Pack(cmdData);

        clientSocket.BeginSend(tcpPkg, 0, tcpPkg.Length, SocketFlags.None, new AsyncCallback((IAsyncResult ir) =>
        {
            try
            {
                Socket client = (Socket)ir.AsyncState;
            }
            catch
            {
            }
        }), clientSocket);
    }
    public void SendProtobufCmd(int stype, int ctype, ProtoBuf.IExtensible body)
    {
        byte[] cmdData = ProtoMan.PackProtobufCmd(stype, ctype, body);
        if (cmdData == null)
        {
            return;
        }
        byte[] tcpPkg = TcpPacker.Pack(cmdData);

        clientSocket.BeginSend(tcpPkg, 0, tcpPkg.Length, SocketFlags.None, new AsyncCallback((IAsyncResult ir) =>
        {
            try
            {
                Socket client = (Socket)ir.AsyncState;
            }
            catch
            {
                ModuleManager.Instance.Invoke("Log", "Failed to Send Cmd");
            }
        }), clientSocket);
    }
示例#7
0
 public void send_json_msg_to_client(int stype, int ctype, string body)
 {
     Protocol_type = Protocol_Type.protocol_json;
     byte[] send_bytes  = EncodeCmd.Encode_Json(stype, ctype, body);
     byte[] tcp_package = TcpPacker.Package(send_bytes);
 }