Клиент-серверное приложение. Передача строки без потери данных - 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д