Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблема. при передаче файла на c# через сокет, c использованием сюрреализации

62K
18 октября 2012 года
Alexander Shulpin
10 / / 18.10.2012
Привет Коденетовцы!
Хочу сделать клиент\серверное приложение на c#. смысл приложения в том что каждый клиент раз в несколько секунд отправляет на сервер некий файл.
Проблема сейчас в том что сервер при приеме и десюрреализации пакета ругается. мол Конец потока обнаружен до завершения разбора.
такого не бывает когда передаешь текст.
но есть, когда передаешь картики. bmp например

может кто знает в чем бедэ?

я так понимаю, что проблема в том что в процессе Deserialize в byte[] встречается '0' , который обработчик принимает за конец массива байтов
и тогда надо правильно организовать данные, попадающие в процесс Serialize
как вы считаете?
394
18 октября 2012 года
MegaMozg
317 / / 18.03.2006
Сериализация
2.1K
18 октября 2012 года
Norgat
452 / / 12.08.2009
Может приведёшь минимальный код, показывающий твою проблему? А то никто же тут не знает, как ты сериализуешь, передаёшь и десериализуешь свои файлы.
62K
18 октября 2012 года
Alexander Shulpin
10 / / 18.10.2012
вот код проекта http://8bit-nn.ru/AdmEye.7z

Конец потока обнаружен до завершения разбора.
в


Код 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();
}
}
2.1K
19 октября 2012 года
Norgat
452 / / 12.08.2009
Проблема у тебя не тут. Ты принимаешь не все отправленные данные с клиента.

Вот тебе скрин:

Поэтому когда передаёшь что-то через сокет надо сначала отправлять размер сообщения получателю, а затем само сообщение, чтобы получатель дочитал сообщение полностью. А то так и будешь терять куски.

P.S. сервер пережал картинку, так что поясню. Твой сервер принял 2048 байт и пытается их десериализовать, а клиент отправил 8294598 байт сериализованного изображения, отсюда все проблемы и вылезают.
62K
20 октября 2012 года
Alexander Shulpin
10 / / 18.10.2012
Цитата: Norgat

отсюда все проблемы и вылезают.



ты божественен!

а как ты отсерфил сколько данных передалось?

2.1K
20 октября 2012 года
Norgat
452 / / 12.08.2009
Цитата: Alexander Shulpin
а как ты отсерфил сколько данных передалось?



Это просто.

1) Перевёл клиент и сервер из оконных приложений в консольные (в свойствах проекта есть переключатель), чтобы появились консоли.

2) Добавил в код сервера

 
Код:
Console.WriteLine("Размер полученного пакета: {0}", Buffer.Length);
DataReceived(Buffer);
и в код клиента

 
Код:
Console.WriteLine("Размер отправляемых данных: {0}", toSend.Length);
client.SendToServer(toSend);
85K
20 октября 2012 года
Amozy
6 / / 09.10.2012
сюрреализации - это что то из области сюрреализма? ;)
А если по теме, то проблема в потере данных.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог