2010-03-17 3 views
6

Я реализую некоторые сетевые материалы в нашем проекте. Было решено, что общение очень важно, и мы хотим сделать это синхронно. Таким образом, клиент отправляет то, что подтверждает сервер.Есть ли какие-то общие рекомендации по сетевому программированию?

Есть ли общие рекомендации по взаимодействию между клиентом и сервером. Например, если нет ответа с сервера, должен ли клиент автоматически повторить попытку? Должен ли быть период ожидания до его повторения? Что произойдет, если подтверждение не будет выполнено? В какой момент мы сломаем соединение и снова подключимся? Есть ли какой-то материал? Я выполнил поиск, но ничего не происходит.

Я ищу лучшие практики в целом. Я реализую это в C# (возможно, с сокетами), поэтому, если есть что-то .Net, то, пожалуйста, дайте мне знать.

+1

http://stackoverflow.com/questions/2368580/socket-protocol-fundamentals может представлять интерес. –

ответ

6

Первое правило сети - вы отправляете сообщения, вы не вызываете функции.

Если вы подходите к сети таким образом и не притворяетесь, что можете удаленно вызывать функции или иметь «удаленные объекты», все будет в порядке. У вас никогда не было реальной «вещи» на другой стороне сетевого подключения - то, что у вас есть, - это в основном фотография этой вещи.

Все Вы получаете из сети старые данные. Вы являетесь никогда обновлен. Из-за этого вам нужно убедиться, что ваши сообщения несут правильную семантику - например, вы можете увеличивать или уменьшать что-либо на значение, вы не должны устанавливать его значение на текущее значение плюс или минус другое (поскольку текущее значение может измените к моменту поступления вашего сообщения).

2

Если клиент и сервер написаны на .NET/C# Я бы порекомендовал WCF InstEd сырых сокетов, как это экономит от многих слесарного кода сериализации и десериализации, синхронизация сообщений и т.д.

Это, может быть, на самом деле не отвечает на ваш вопрос о лучших практиках;;)

1

Первое, что нужно сделать, это охарактеризовать вашу конкретную сеть с точки зрения скорости, вероятности потерянных сообщений, номинального и максимального трафика, узких мест, клиентов и сервер MTBF, ...

Тогда и только тогда вы решаете, что вам нужно для y наш протокол. Во многих случаях вам не нужны сложные механизмы обработки ошибок и могут надежно реализовать службу с простым UDP.

В некоторых случаях вам необходимо создать нечто более надежное, чтобы поддерживать согласованное глобальное состояние между несколькими машинами, подключенными через сеть, которой вы не можете доверять.

1

Самое главное, я обнаружил, что сообщения должны всегда быть лицом без гражданства (читать на REST, если это ничего не значит для вас)

Например, если ваше приложение отслеживает количество грузов по сети не отправлять инкрементный Обновления (+ x), но всегда новые.

+0

Это имеет смысл. Хороший совет. К счастью для нас наши сообщения без гражданства. Это скорее совпадение, чем дизайн, хотя :) – uriDium

+0

Хорошо для вас! Недавно мне пришлось ретроспективно изменить приложение, которое включало сообщения-сообщения для всех вещей, которые в конечном итоге всегда путались бы. –

+0

Без гражданства - это хорошая общая рекомендация, но не всегда * требуется. В некоторых сценариях действительно требуются сообщения без апатридов - это зависит от ситуации. Тем не менее, переход на апатрид - это большая эвристика. И что-то вроде «переключающего сообщения» по своей сути плохо. С другой стороны, как я указывал в своем ответе, что-то вроде «increment» часто является именно тем, что вы хотите, поскольку оно всегда будет делать правильную вещь на сервере (против «установлено до 5», если вы считаете текущее значение is 4) – kyoryu

0

В общем, подумайте о сетевом программировании, я думаю, вам следует узнать о:
1. Гнездо (конечно).
2. Вилка и резьба.
3. Процесс блокировки (использование мьютекса или семафора или другие).

Надеюсь, эта помощь ..

+0

Привет, спасибо, но не совсем. Все это прекрасно. Я просто искал некоторые общие рекомендации. Например, использование ACK и т. Д. – uriDium

+0

Вместо того, чтобы узнать о потоковой передаче, я бы узнал о неблокирующем IO (если работает на уровне сокета, то есть). – kyoryu

Смежные вопросы