Клиент-серверное приложение. Передача строки без потери данных - 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);

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


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

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

9   голосов , оценка 4.222 из 5
Похожие ответы