コード例 #1
0
ファイル: Network.cs プロジェクト: tamutamu/chaos
        /// <summary>
        /// 指定された接続にパケット種別を付加してデータを送信します。
        /// preferCompress == trueの時、データを圧縮してサイズが
        /// 元のサイズより減少する場合は圧縮データを送信します。
        /// </summary>
        /// <param name="client">送信するTcpClientオブジェクト</param>
        /// <param name="type">送信データの種別</param>
        /// <param name="data">送信データ</param>
        /// <param name="preferCompress">データを圧縮する場合はtrue</param>
        private static void InnerWrite(TcpClient client, PacketType type, byte[] data, bool preferCompress)
        {
            NetworkStream stream = client.GetStream();

            //  パケット種別を書き込む
            byte[] datatype = MemoryCopy.ToByteArrayFromInt((int)type);
            stream.Write(datatype, 0, datatype.Length);
            if (data != null)
            {
                //  送信データの圧縮
                byte[] compressedData = null;
                if (preferCompress)
                {
                    using (MemoryStream ms = new MemoryStream())
                        using (DeflateStream ds = new DeflateStream(ms, CompressionMode.Compress))
                        {
                            ds.Write(data, 0, data.Length);
                            ds.Close(); //  FlushでなくCloseでないといけないらしい。。
                            compressedData = ms.ToArray();
                        }
                }
                byte[] datasize = new byte[8];
                if (compressedData != null && compressedData.Length < data.Length)
                {
                    //  圧縮データのサイズと展開後のサイズを書き込む
                    MemoryCopy.SetInt(datasize, 0, compressedData.Length);
                    MemoryCopy.SetInt(datasize, 4, data.Length);
                    stream.Write(datasize, 0, datasize.Length);
                    //  圧縮データを書き込む
                    stream.Write(compressedData, 0, compressedData.Length);
                }
                else
                {
                    //  圧縮してもサイズが減少しなかったので元のデータを書き込む
                    MemoryCopy.SetInt(datasize, 0, data.Length);
                    MemoryCopy.SetInt(datasize, 4, data.Length);
                    stream.Write(datasize, 0, datasize.Length);
                    stream.Write(data, 0, data.Length);
                }
            }
            else
            {
                //  送信データのサイズを書き込む(値は0)
                byte[] datasize = MemoryCopy.ToByteArrayFromInt(0);
                stream.Write(datasize, 0, datasize.Length);
            }
        }