Клиент-серверное приложение. Передача строки без потери данных - C#
Формулировка задачи:
Помогите реализовать передачу данных между клиентом и сервером. Сейчас использую данный код. Но проблема в том что при передаче строки более 500 символов иногда возникают ошибки с получением всей строки.
Листинг программы
- //Клиент
- using System;
- using System.Text;
- using System.Net;
- using System.Net.Sockets;
- namespace SocketTcpClient
- {
- class Program
- {
- static void Main(string[] args)
- {
- int i = 20;
- while (true)
- {
- try
- {
- IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.0.150"), 12000);
- Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- // подключаемся к удаленному хосту
- socket.Connect(ipPoint);
- i++;
- string message = GetRandomString(i);
- byte[] data = Encoding.Unicode.GetBytes(message);
- socket.Send(data);
- // получаем ответ
- data = new byte[16]; // буфер для ответа
- StringBuilder builder = new StringBuilder();
- int bytes = 0; // количество полученных байт
- do
- {
- bytes = socket.Receive(data, data.Length, 0);
- builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
- }
- while (socket.Available > 0);
- if(Convert.ToInt64(builder.ToString()) == message.Length)
- {
- Console.WriteLine("OK " + message.Length);
- }
- else
- {
- Console.WriteLine("NOT");
- Console.WriteLine(message);
- Console.ReadKey();
- }
- socket.Shutdown(SocketShutdown.Both);
- socket.Close();
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- }
- }
- public static string GetRandomString(int L)
- {
- var allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789";
- var length = L;
- var chars = new char[length];
- var rd = new Random();
- for (var i = 0; i < length; i++)
- {
- chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
- }
- return new String(chars);
- }
- }
- }
Листинг программы
- //Сервер
- using System;
- using System.Text;
- using System.Net;
- using System.Net.Sockets;
- namespace SocketTcpServer
- {
- class Program
- {
- static void Main(string[] args)
- {
- IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 12000);
- Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- try
- {
- listenSocket.Bind(ipPoint);
- listenSocket.Listen(10);
- Console.WriteLine("Сервер запущен. Ожидание подключений...");
- while (true)
- {
- Socket handler = listenSocket.Accept();
- // получаем сообщение
- StringBuilder builder = new StringBuilder();
- int bytes = 0; // количество полученных байтов
- byte[] data = new byte[16]; // буфер для получаемых данных
- do
- {
- bytes = handler.Receive(data);
- builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
- }
- while (handler.Available > 0);
- string Message = builder.ToString();
- Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + Message);
- // отправляем ответ
- string message = Message.Length.ToString();
- data = Encoding.Unicode.GetBytes(message);
- handler.Send(data);
- // закрываем сокет
- handler.Shutdown(SocketShutdown.Both);
- handler.Close();
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- }
- }
- }
Решение задачи: «Клиент-серверное приложение. Передача строки без потери данных»
textual
Листинг программы
- // получаем сообщение
- StringBuilder builder = new StringBuilder();
- Decoder decoder = Encoding.Unicode.GetDecoder();
- byte[] data = new byte[16]; // буфер для получаемых данных
- char[] charData = new char[data.Length];
- do
- {
- int bytes = handler.Receive(data);
- int charCount = decoder.GetChars(data, 0, bytes, charData, 0);
- builder.Append(charData, 0, charCount);
- }
- while (handler.Available > 0);
- string Message = builder.ToString();
- Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + Message);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д