Отправка данных через сокеты - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Я сделал программу (Точнее 2 : сервер и клиент). Суть клиента - отправить скриншот экрана, сервера - принять и сохранить скриншот. С этой задачей программа справляется, но есть несколько нюансов : 1. Чем больше буффер приема данных, тем больше шанс того, что картинка будет частично (А бывает и полностью) черной. 2. Программа оочень медленная. При значении буффера 1 (Когда скриншоты не искажаются) для 1 скриншота тратится 5 секунд. А ведь если использовать 4к разрешение, то там и все 20-30 секунд уйдут. Вот код : Сервер
Листинг программы
  1. Socket _ClientS = _ServerS.Accept();
  2. Console.WriteLine("Соединение установлено");
  3. List<byte> _Data = new List<byte>();
  4. int _Bytes = 0;
  5. byte[] _Buffer = new byte[64];
  6. do
  7. {
  8. _Bytes = _ClientS.Receive(_Buffer);
  9. for (int i = 0; i < _Buffer.Length; i++)
  10. {
  11. _Data.Add(_Buffer[i]);
  12. }
  13. }
  14. while (_ClientS.Available > 0);
  15. byte[] _BData = new byte[_Data.Count];
  16. for (int i = 0; i < _Data.Count; i++)
  17. {
  18. _BData[i] = _Data[i];
  19. }
Клиент
Листинг программы
  1. Socket _ClientS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  2. Thread.Sleep(100);
  3. _ClientS.Connect(_IpEndP);
  4. //Console.WriteLine("Нажмите на любую кнопку для создания скриншота...");
  5. //Console.ReadKey();
  6. Bitmap _BitMap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppRgb);
  7. using (Graphics _Gr = Graphics.FromImage(_BitMap))
  8. {
  9. _Gr.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
  10. }
  11. byte[] _Data = null;
  12. BitmapData _BData = _BitMap.LockBits(new Rectangle(new Point(), _BitMap.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
  13. int _ByteCount = _BData.Stride * _BitMap.Height;
  14. _Data = new Byte[_ByteCount];
  15. Marshal.Copy(_BData.Scan0, _Data, 0, _ByteCount);
  16. _BitMap.UnlockBits(_BData);
  17. _ClientS.Send(_Data);
  18. _ClientS.Shutdown(SocketShutdown.Both);
  19. _ClientS.Close();
Очень сильно нагружает сервер то, что скриншот отправляется кусочками, эти кусочки собираются в массиве типа List, а потом, когда все кусочки собраны, все данные из List переписываются в массив, а массив обрабатывается и становится картинкой. Клиент же преобразует скриншот в массив байтов и отправляет. Чем вызвана первая проблема? Как ее исправить? Как можно более рациональным способ решить проблему 2? Буду преблагодарен всем тем, кто помог решить проблемы.

Решение задачи: «Отправка данных через сокеты»

textual
Листинг программы
  1.          Socket _ClientS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  2.          Thread.Sleep(100);
  3.          _ClientS.Connect(_IpEndP);
  4.          //Console.WriteLine("Нажмите на любую кнопку для создания скриншота...");
  5.          //Console.ReadKey();
  6.  
  7.          using(Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppRgb))
  8.          using(Graphics g = Graphics.FromImage(bitmap))
  9.          using(MemoryStream ms = new MemoryStream())
  10.          {
  11.             g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
  12.             bitmap.Save(ms, ImageFormat.Png);
  13.             _ClientS.Send(ms.ToArray());
  14.             _ClientS.Shutdown(SocketShutdown.Both);
  15.             _ClientS.Close();
  16.          }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы