Console.WriteLine("Размер полученного пакета: {0}", Buffer.Length);
DataReceived(Buffer);
проблема. при передаче файла на c# через сокет, c использованием сюрреализации
Хочу сделать клиент\серверное приложение на c#. смысл приложения в том что каждый клиент раз в несколько секунд отправляет на сервер некий файл.
Проблема сейчас в том что сервер при приеме и десюрреализации пакета ругается. мол Конец потока обнаружен до завершения разбора.
такого не бывает когда передаешь текст.
но есть, когда передаешь картики. bmp например
может кто знает в чем бедэ?
я так понимаю, что проблема в том что в процессе Deserialize в byte[] встречается '0' , который обработчик принимает за конец массива байтов
и тогда надо правильно организовать данные, попадающие в процесс Serialize
как вы считаете?
Сериализация
Может приведёшь минимальный код, показывающий твою проблему? А то никто же тут не знает, как ты сериализуешь, передаёшь и десериализуешь свои файлы.
Конец потока обнаружен до завершения разбора.
в
Код C#
namespace Protocol
{
public static class SerializeHelper
{
public static T Deserialize<T>(byte[] data)
{
BinaryFormatter serializer = new BinaryFormatter();
return (T)serializer.Deserialize(new MemoryStream(data)); <====================
}
public static byte[] Serialize<T>(T obj)
{
BinaryFormatter serializer = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
serializer.Serialize(stream, obj);
return stream.ToArray();
}
}
Вот тебе скрин:
Поэтому когда передаёшь что-то через сокет надо сначала отправлять размер сообщения получателю, а затем само сообщение, чтобы получатель дочитал сообщение полностью. А то так и будешь терять куски.
P.S. сервер пережал картинку, так что поясню. Твой сервер принял 2048 байт и пытается их десериализовать, а клиент отправил 8294598 байт сериализованного изображения, отсюда все проблемы и вылезают.
Цитата: Norgat
отсюда все проблемы и вылезают.
ты божественен!
а как ты отсерфил сколько данных передалось?
Цитата: Alexander Shulpin
а как ты отсерфил сколько данных передалось?
Это просто.
1) Перевёл клиент и сервер из оконных приложений в консольные (в свойствах проекта есть переключатель), чтобы появились консоли.
2) Добавил в код сервера
Код:
Код:
Console.WriteLine("Размер отправляемых данных: {0}", toSend.Length);
client.SendToServer(toSend);
client.SendToServer(toSend);
А если по теме, то проблема в потере данных.