2012-02-03 1 views
1

Я пишу клиент-серверное приложение. У меня есть некоторые структуры данных, которые я хочу отправить через сеть от клиента к серверу. Я представляю их как массив байтов определенного размера. Сервер и клиент знают об этой структуре.Каков наилучший способ передачи данных по сети с подтверждением. .Net

Моя цель состоит в том, чтобы послать группы структур и ждать подтверждения от сервера, на котором они были получены и правильно сохраненному на его стороне ..

Моя идея состояла в том, чтобы создать простой код.

стороне клиента:

  1. подключиться к серверу;
  2. подготовить список структур;
  3. в цикле отправлять их в виде массивов байтов в сеть с использованием метода Stream.Write (...). Затем Flush();
  4. ждать ответа сервера о том, сколько данных он мог бы сохранить.
  5. повторите все с шага 2.

стороне сервера:

  1. принять соединение клиента;
  2. получать данные до конца (Stream.Read() не хочет определять, что конец данных может быть из-за того, что соединение все еще живое);
  3. сохранить все данные на диск;
  4. отправьте ответ о количестве сохраненных данных клиенту с использованием того же клиентского соединения, которое использовалось для получения данных от клиента.

Проблема была в том, что на стороне сервера я не мог определить конец группы данных, отправленной клиентом.

как сделать все, что я хочу сорвать?

+0

Вы посмотрели на программирование на C#. Какие типы данных вы пытаетесь передать по сети. это будет TCP/IP, именованные каналы, сокеты, потоки/многопотоковые ..etc .. Хороший вопрос, который у вас есть, но вы не указали тип данных, которые должны быть переданы .. спасибо – MethodMan

+0

Мои исходные данные - это куча структур. Перед отправкой я конвертирую их в байтовые массивы и переношу их с помощью класса NetworkStream. – yurart

+0

Кразе уже задал некоторые интересные факты о данных. Кроме того, вы должны указать, является ли производительность проблемой. Похоже, что простая WCF-служба будет достаточной для того, что вы пытаетесь выполнить. –

ответ

0

Редактировать: OP теперь добавил комментарий о том, что ему нужно использовать pre. NET 3.0.

При условии, что оба конца соединения являются .NET, WCF должен иметь все инструменты, необходимые для управления передачей данных.

Более конкретно, посмотреть на

Кроме того, если вы когда-нибудь понадобится, чтобы перейти к асинхронной передачи данных, вы можете изменить к queued transport like MSMQ.

+0

Я уже говорил о WCF выше. Я посмотрю MSMQ немного позже. Спасибо – yurart

+0

Возможно, вы сможете сэкономить массу времени отладки и отладки, перейдя на .NET 4? – StuartLC

+0

Я понимаю, но наше программное обеспечение должно работать на старых машинах с окнами 2000, которые не принимают .net 3.0, насколько я помню – yurart

2

Это звучит для меня, что этот вопрос является Flush() не делать ничего - что на самом деле документально поведение для NetworkStream.Flush():

смывного метод реализует поток.Метод Flush; однако, поскольку NetworkStream не буферизирован, он не влияет на сетевые потоки. Вызов метода Flush не вызывает исключения.

Чтобы обойти это; Я хотел бы настроить сокет для отправки немедленно (комплект NoDelay к true), а затем, чтобы избежать проблем с размером пакета, я бы обернуть NetworkStream в BufferedStream (учитывая, что один буферный поток хорош только для либо чтения или пишут, но не оба одновременно). Тогда:

  • писать, писать, писать и т.д. в BufferedStream
    • всякий раз, когда она полна она будет писать в сети, немедленно
  • отправки промывать BufferedStream
    • , который будет писать в сеть, сразу посылая

это позволит послать конец вашего сообщения без застревания в выходном буфере и без необходимости закрывать поток.

+0

Я не могу сейчас попробовать, но я постараюсь сделать это в ближайшем будущем. Спасибо – yurart

+0

Если я не ошибаюсь, некоторые комментарии просто исчезли отсюда ... – yurart

+0

@yurart нет, нет удаленных комментариев –

0

Я использовал .Net Remoting для выполнения задач передачи данных. Итак, проблема решена (если других не появится :))