Существуют ли общие рекомендации по сетевому программированию?

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

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

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

5 ответов


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

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

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


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

это, возможно, на самом деле не отвечает на ваш вопрос о лучших практиках ;-)


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

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

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


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

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


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

надеюсь, что это поможет..