Клиент-серверное приложение. Передача строки без потери данных - C#

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

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

Помогите реализовать передачу данных между клиентом и сервером. Сейчас использую данный код. Но проблема в том что при передаче строки более 500 символов иногда возникают ошибки с получением всей строки.
Листинг программы
  1. //Клиент
  2. using System;
  3. using System.Text;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. namespace SocketTcpClient
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. int i = 20;
  13. while (true)
  14. {
  15. try
  16. {
  17. IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.0.150"), 12000);
  18. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  19. // подключаемся к удаленному хосту
  20. socket.Connect(ipPoint);
  21. i++;
  22. string message = GetRandomString(i);
  23. byte[] data = Encoding.Unicode.GetBytes(message);
  24. socket.Send(data);
  25. // получаем ответ
  26. data = new byte[16]; // буфер для ответа
  27. StringBuilder builder = new StringBuilder();
  28. int bytes = 0; // количество полученных байт
  29. do
  30. {
  31. bytes = socket.Receive(data, data.Length, 0);
  32. builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
  33. }
  34. while (socket.Available > 0);
  35. if(Convert.ToInt64(builder.ToString()) == message.Length)
  36. {
  37. Console.WriteLine("OK " + message.Length);
  38. }
  39. else
  40. {
  41. Console.WriteLine("NOT");
  42. Console.WriteLine(message);
  43. Console.ReadKey();
  44. }
  45. socket.Shutdown(SocketShutdown.Both);
  46. socket.Close();
  47. }
  48. catch (Exception ex)
  49. {
  50. Console.WriteLine(ex.Message);
  51. }
  52. }
  53. }
  54. public static string GetRandomString(int L)
  55. {
  56. var allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789";
  57. var length = L;
  58. var chars = new char[length];
  59. var rd = new Random();
  60. for (var i = 0; i < length; i++)
  61. {
  62. chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
  63. }
  64. return new String(chars);
  65. }
  66. }
  67. }
Листинг программы
  1. //Сервер
  2. using System;
  3. using System.Text;
  4. using System.Net;
  5. using System.Net.Sockets;
  6.  
  7. namespace SocketTcpServer
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 12000);
  14. Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  15. try
  16. {
  17. listenSocket.Bind(ipPoint);
  18. listenSocket.Listen(10);
  19. Console.WriteLine("Сервер запущен. Ожидание подключений...");
  20. while (true)
  21. {
  22. Socket handler = listenSocket.Accept();
  23. // получаем сообщение
  24. StringBuilder builder = new StringBuilder();
  25. int bytes = 0; // количество полученных байтов
  26. byte[] data = new byte[16]; // буфер для получаемых данных
  27. do
  28. {
  29. bytes = handler.Receive(data);
  30. builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
  31. }
  32. while (handler.Available > 0);
  33. string Message = builder.ToString();
  34. Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + Message);
  35. // отправляем ответ
  36. string message = Message.Length.ToString();
  37. data = Encoding.Unicode.GetBytes(message);
  38. handler.Send(data);
  39. // закрываем сокет
  40. handler.Shutdown(SocketShutdown.Both);
  41. handler.Close();
  42. }
  43. }
  44. catch (Exception ex)
  45. {
  46. Console.WriteLine(ex.Message);
  47. }
  48. }
  49. }
  50. }

Решение задачи: «Клиент-серверное приложение. Передача строки без потери данных»

textual
Листинг программы
  1.                     // получаем сообщение
  2.                     StringBuilder builder = new StringBuilder();
  3.                     Decoder decoder = Encoding.Unicode.GetDecoder();
  4.                     byte[] data = new byte[16]; // буфер для получаемых данных
  5.                     char[] charData = new char[data.Length];
  6.  
  7.                     do
  8.                     {
  9.                         int bytes = handler.Receive(data);
  10.                         int charCount = decoder.GetChars(data, 0, bytes, charData, 0);
  11.                         builder.Append(charData, 0, charCount);
  12.                     }
  13.                     while (handler.Available > 0);
  14.                     string Message = builder.ToString();
  15.                     Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + Message);

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


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

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

9   голосов , оценка 4.222 из 5

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

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

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