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