Передача данных по сети (TCP, Socket) - C#

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

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

Никак не могу понять в каком именно месте ошибка. С клиента на сервер передаются данные. Сначала название будущего файла, а затем строка с текстом (элемент класса который сериализован в JSON, но не думаю, что это важно, т.к. он работает как нужно). Так вот, сервером сначала принимается размер строки, а потом уже и сама строка. Название файла принимается полностью (причем также не совсем понимаю почему если в строке byte[] cldataLength = new byte[4]; заменить 4 например на 6, то уже будет кусок от имени файла). А вот сама строка с сериализованным объектом принимается уже немного обрезанной, причем после чего возникает исключение System.OverflowException в строке
cldata = new byte[n];
Код программы: Метод у сервера:
public void GetData()
        {
            bool NotFileName = true;
            string FileName = "";
            while (true)
            {
                try
                {
                    string data = "";
                    byte[] cldata = { };
                    byte[] cldataLength = new byte[4];
                    ClientSock.Receive(cldataLength);
                    int n = BitConverter.ToInt32(cldataLength, 0);
                    cldata = new byte[n];
                    ClientSock.Receive(cldata);
 
                    data = Encoding.UTF8.GetString(cldata);
                    //----------------------
                    Console.WriteLine(data);
                    //---------------------
                    if (data == "$CLOSE$")
                    {
                        Close();
                        break;
                    }
                    if (data == "$ENDSEND$")
                    {
                        break;
                    }
                    if (NotFileName)
                    {
                        FileName = data;
                        NotFileName = false;
                    }
                    //else
                        //TList.AddTask(JSON.From<Record>(data));
                }
                catch(Exception e)
                {
                    Close();
                    Log.Write("[" + DateTime.Now.ToString() + "]" + e);
                    Console.WriteLine(e);
                    return;
                }
            }
            FileWork FWork = new FileWork();
            //FWork.FileWrite(TList.GetAllRecord(), FileName, false);
        }
Метод клиента:
public void SendLine(List<Record> lst, string FileName)
        {
            Sock.Send(BitConverter.GetBytes(FileName.Length));
            Sock.Send(Encoding.UTF8.GetBytes(FileName));
            foreach (Record rec in lst)
            {
                string data = JSON.To<Record>(rec);
                Sock.Send(BitConverter.GetBytes(data.Length));
                Sock.Send(Encoding.UTF8.GetBytes(data));   
            }
        }
Всё-таки проблема в определении размера будущей переданной строки. Как правильней сообщить серверу размер строки, чтобы выделить место именно под нее и соответственно принять ее?

Решение задачи: «Передача данных по сети (TCP, Socket)»

textual
Листинг программы
byte[] data = Encoding.UTF8.GetBytes(FileName)
Sock.Send(BitConverter.GetBytes(data .Length));
Sock.Send(data );

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


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

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

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