I use for exchange with 1C exchange through data packing lines Using TCD to WM 6 as a wireless scanner to receive data from 1C
using System.Collections.Generic; using System.Text; using System.IO.Compression; using System.IO; using System.Net.Sockets; namespace TCPConnectTo1C { public class ДляОбменаПоТСП { public static readonly Encoding 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(); } private static byte[] МассивБайтовИзСтрима(NetworkStream стрим, int размерМассива) { byte[] result = new byte[размерМассива]; int количествоСчитанныхСимволов = 0; while (размерМассива > количествоСчитанныхСимволов) { количествоСчитанныхСимволов += стрим.Read(result, количествоСчитанныхСимволов, размерМассива - количествоСчитанныхСимволов); } return result; } public static void ЗаписатьМассивБайтовВСтрим(NetworkStream стрим, byte[] Массив) { стрим.Write(Массив, 0, Массив.Length); } public static bool ReadBool(NetworkStream стрим) { return BitConverter.ToBoolean(МассивБайтовИзСтрима(стрим,1), 0); } public static void Write(NetworkStream стрим, bool Value) { ЗаписатьМассивБайтовВСтрим(стрим, BitConverter.GetBytes(Value)); } public static Int32 ReadInt32(NetworkStream стрим) { return BitConverter.ToInt32(МассивБайтовИзСтрима(стрим,4), 0); } public static void Write(NetworkStream стрим, Int32 Value) { ЗаписатьМассивБайтовВСтрим(стрим, BitConverter.GetBytes(Value)); } public static string ReadString(NetworkStream стрим) { int РазмерДанных=ReadInt32(стрим); if (РазмерДанных == 0) return ""; var данные=МассивБайтовИзСтрима(стрим,РазмерДанных); return CurrentEncoder.GetString(данные, 0, данные.Length); } public static void Write(NetworkStream стрим, string Value) { if (Value.Length == 0) { Write(стрим, 0); return; } byte[] result = CurrentEncoder.GetBytes(Value); Write(стрим, result.Length); ЗаписатьМассивБайтовВСтрим(стрим,result); } public static string ReadCompressedString(NetworkStream стрим) { // int РазмерДанных = ReadInt32(стрим); // return CurrentEncoder.GetString(МассивБайтовИзСтрима(стрим, РазмерДанных)); bool ЭтоСжатаяСтрока = ReadBool(стрим); if (!ЭтоСжатаяСтрока) return ReadString(стрим); int РазмерДанныхДляКоманды = BitConverter.ToInt32(МассивБайтовИзСтрима(стрим, 4), 0); byte[] массивДанныхДляКоманды = МассивБайтовИзСтрима(стрим, РазмерДанныхДляКоманды); массивДанныхДляКоманды = РасжатьДанные(массивДанныхДляКоманды); return CurrentEncoder.GetString(массивДанныхДляКоманды, 0, массивДанныхДляКоманды.Length); } 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); } } public static void ОтправтьКоманду(NetworkStream strim,string Команда, string ДанныеДляКоманды, bool ЕстьОтвет) { Write(strim,ЕстьОтвет); Write(strim,Команда); WriteCompressedString(strim,ДанныеДляКоманды); } public static void ПринятьКоманду(NetworkStream strim, out string Команда, out string ДанныеДляКоманды, out bool ЕстьОтвет) { ЕстьОтвет=ReadBool(strim); Команда=ReadString(strim); ДанныеДляКоманды=ReadCompressedString(strim); } } }
And sending
bool СоединитьсяССервером() { try { if (клиент == null) { клиент = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); клиент.Connect(ipEndpoint); } return true; } catch (SocketException ex) { MessageBox.Show("Ошибка соединения с сервером: " + ex.Message); клиент.Close(); клиент = null; return false; } } string ОтправтьКоманду(string Команда, string ДанныеДляКоманды, bool ЕстьОтвет, bool ЗакрытьСоединение, out bool ОшибкаСоединения) { var result = ""; ОшибкаСоединения = false; try { if (!СоединитьсяССервером()) { ОшибкаСоединения = true; return "Ошибка"; } using (var strim = new NetworkStream(клиент)) { try { ДляОбменаПоТСП.ОтправтьКоманду(strim, Команда, ДанныеДляКоманды, ЕстьОтвет); if (ЕстьОтвет) result = ДляОбменаПоТСП.ReadCompressedString(strim); } catch (SocketException ex) { MessageBox.Show("Ошибка отправки данных: " + ex.Message); result = "Ошибка"; ОшибкаСоединения = true; } if (ЗакрытьСоединение) { клиент.Close(); клиент = null; } } } catch (SocketException ex) { MessageBox.Show("Ошибка соединения с сервером: " + ex.Message); result = "Ошибка"; ОшибкаСоединения = true; }
And on the server
public void ОткрытьАйПиПортСНомеромПорта(int НомерПорта) { Event = new AutoResetEvent(false); ИдПотока = Thread.CurrentThread.ManagedThreadId; ЭтоЗакрытие = false; Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipEndpoint = new IPEndPoint(IPAddress.Any, НомерПорта); Server.Bind(ipEndpoint); Server.Listen(1); Server.BeginAccept(new AsyncCallback(ОбработкаСоединения), Server); } public void Ответить(string Ответ) { Otvet = Ответ; Event.Set(); } private void ОбработкаСоединения(IAsyncResult AsyncCall) { Socket listener = (Socket)AsyncCall.AsyncState; if (listener == null || (ЭтоЗакрытие)) return; Socket client = listener.EndAccept(AsyncCall); ВыполнитьКоманду(client); listener.BeginAccept(new AsyncCallback(ОбработкаСоединения), listener); } private void ВыполнитьКоманду(Socket client) { NetworkStream стрим=new NetworkStream(client); try { var Данные = ДляОбменаПоТСП.ПринятьКоманду(стрим); Event.Reset(); if (ПришлоСообщениеПоTCP!=null) ПришлоСообщениеПоTCP(Данные); if (Данные.ЕстьОтвет) { Event.WaitOne(); ДляОбменаПоТСП.WriteCompressedString(стрим, Otvet); } } catch (Exception e) { ЗаписатьОшибку(DateTime.Now.ToString() + e.ToString()); } }
The project can be found here https://yadi.sk/d/G1FvJW_Ytfc5X