Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.IO.Compression;
- using System.IO;
- using System.Net.Sockets;
- using System.Threading.Tasks;
- namespace TCPConnectTo1C
- {
- // Структура сообщения полученная от клиентиа
- public class СтруктураСообщения
- {
- public bool ЕстьОтвет;
- public string Команда;
- public string Данные;
- public СтруктураСообщения(string Команда, string Данные, bool ЕстьОтвет)
- {
- this.ЕстьОтвет = ЕстьОтвет;
- this.Команда = Команда;
- this.Данные = Данные;
- }
- public override string ToString()
- {
- return $"ЕстьОтвет={ЕстьОтвет}, Команда={Команда}, Данные={Данные}";
- }
- }
- // Класс для формирования сообщения и его разбора
- // Данные упаковываются GZip и если сжатые данные меньше оригинала то отправляются сжатые данные
- //
- public class ДляОбменаПоТСП
- {
- public static readonly Encoding CurrentEncoder;//=Encoding.GetEncoding(1251);
- static ДляОбменаПоТСП()
- {
- //Вот здесо особенность .Net Core
- // Нужно зарегистрировать провайдера
- // и прописать в зависимости "System.Text.Encoding.CodePages"
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- // CurrentEncoder = Encoding.GetEncoding("windows-1251");
- // Так как мы используем Руслиш то используем кодировку 1251
- CurrentEncoder = Encoding.GetEncoding(1251);
- }
- public static byte[] РасжатьДанные(byte[] массивДанныхДляКоманды)
- {
- var memStream = new MemoryStream(массивДанныхДляКоманды);
- var DecompressStream = new MemoryStream();
- using (GZipStream gzipStream = new GZipStream(memStream, CompressionMode.Decompress, false))
- {
- Byte[] buffer = new Byte[1 << 16];
- int h;
- while ((h = gzipStream.Read(buffer, 0, buffer.Length)) > 0)
- {
- DecompressStream.Write(buffer, 0, h);
- }
- }
- return DecompressStream.ToArray();
- }
- //
- public static byte[] СжатьДанные(byte[] Value)
- {
- var memStream = new MemoryStream();
- memStream.Position = 0;
- using (GZipStream gzipStream = new GZipStream(memStream, CompressionMode.Compress))
- {
- gzipStream.Write(Value, 0, Value.Length);
- gzipStream.Flush();
- }
- return memStream.ToArray();
- }
- // Классичекое чтение из NetworkStream зная размер получаемых данных
- private static byte[] МассивБайтовИзСтрима(NetworkStream стрим, int размерМассива)
- {
- byte[] result = new byte[размерМассива];
- int количествоСчитанныхСимволов = 0;
- while (размерМассива > количествоСчитанныхСимволов)
- {
- количествоСчитанныхСимволов += стрим.Read(result, количествоСчитанныхСимволов, размерМассива - количествоСчитанныхСимволов);
- }
- return result;
- }
- public static void ЗаписатьМассивБайтовВСтрим(NetworkStream стрим, byte[] Массив)
- {
- стрим.Write(Массив, 0, Массив.Length);
- }
- // Считываем из потока 1 байт и конвертируем в bool
- public static bool ReadBool(NetworkStream стрим)
- {
- return BitConverter.ToBoolean(МассивБайтовИзСтрима(стрим,1), 0);
- }
- // Конвертирум bool в 1 байт и записываем в поток
- public static void Write(NetworkStream стрим, bool Value)
- {
- ЗаписатьМассивБайтовВСтрим(стрим, BitConverter.GetBytes(Value));
- }
- // Считываем из потока 4 байта и конвертируем в int
- public static Int32 ReadInt32(NetworkStream стрим)
- {
- return BitConverter.ToInt32(МассивБайтовИзСтрима(стрим,4), 0);
- }
- // Конвертирум int в 4 байта и записываем в поток
- public static void Write(NetworkStream стрим, Int32 Value)
- {
- ЗаписатьМассивБайтовВСтрим(стрим, BitConverter.GetBytes(Value));
- }
- // Считываем строку. Сначала идет размер данных int
- //затем считываем данные и получаем строку используя кодировку 1251
- public static string ReadString(NetworkStream стрим)
- {
- int РазмерДанных=ReadInt32(стрим);
- if (РазмерДанных == 0) return "";
- return CurrentEncoder.GetString(МассивБайтовИзСтрима(стрим,РазмерДанных));
- }
- // Записываем строку. Сначала записываем размер строки, затем конвертируем в byte[] используя кодировку 1251
- public static void Write(NetworkStream стрим, string Value)
- {
- if (Value.Length == 0)
- {
- Write(стрим, 0);
- return;
- }
- byte[] result = CurrentEncoder.GetBytes(Value);
- Write(стрим, result.Length);
- ЗаписатьМассивБайтовВСтрим(стрим,result);
- }
- // Смотри WriteCompressedString это обратная операция
- public static string ReadCompressedString(NetworkStream стрим)
- {
- // int РазмерДанных = ReadInt32(стрим);
- // return CurrentEncoder.GetString(МассивБайтовИзСтрима(стрим, РазмерДанных));
- bool ЭтоСжатаяСтрока = ReadBool(стрим);
- if (!ЭтоСжатаяСтрока) return ReadString(стрим);
- int РазмерДанныхДляКоманды = BitConverter.ToInt32(МассивБайтовИзСтрима(стрим, 4), 0);
- byte[] массивДанныхДляКоманды = МассивБайтовИзСтрима(стрим, РазмерДанныхДляКоманды);
- массивДанныхДляКоманды = РасжатьДанные(массивДанныхДляКоманды);
- return CurrentEncoder.GetString(массивДанныхДляКоманды);
- }
- // Пытаемся сжать строку GZIP. Если размер сжатых данных меньше оригинала то записываем сжатые танные
- //иначе оригинал
- // Записываем данные в следующей последовательности
- //bool флаг сжатия данных
- //int размер данных
- //byte[] данные
- public static void WriteCompressedString(NetworkStream стрим, string Value)
- {
- if (Value.Length == 0)
- {
- Write(стрим, false);
- Write(стрим, 0);
- return;
- }
- byte[] result = CurrentEncoder.GetBytes(Value);
- var СжатыеДанные=СжатьДанные(result);
- if (result.Length>СжатыеДанные.Length)
- {
- Write(стрим, true);
- Write(стрим, СжатыеДанные.Length);
- ЗаписатьМассивБайтовВСтрим(стрим,СжатыеДанные);
- }
- else
- {
- Write(стрим, false);
- Write(стрим, result.Length);
- ЗаписатьМассивБайтовВСтрим(стрим,result);
- }
- }
- // Отправляем данные на сервер
- // string Команда имя метода который будет обрабатывать данные
- // string ДанныеДляКоманды это сериализованные данные ввиде строки
- // bool ЕстьОтвет признак функции или процедуры метода обрабатывающего данные
- public static void ОтправитьКоманду(NetworkStream strim,string Команда, string ДанныеДляКоманды, bool ЕстьОтвет)
- {
- Write(strim,ЕстьОтвет);
- Write(strim,Команда);
- WriteCompressedString(strim,ДанныеДляКоманды);
- }
- // Прочитать данные с клиента
- public static СтруктураСообщения ПринятьКоманду(NetworkStream strim)
- {
- bool ЕстьОтвет=ReadBool(strim);
- string Команда=ReadString(strim);
- string ДанныеДляКоманды=ReadCompressedString(strim);
- return new СтруктураСообщения(Команда, ДанныеДляКоманды, ЕстьОтвет);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement