Передача данных по сети (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 );