/// <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); } }