Есть ли некоторые общие лучшие практики Сетевого программирования?

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

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

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

6
задан skaffman 17 March 2010 в 08:39
поделиться

5 ответов

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

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

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

6
ответ дан 10 December 2019 в 00:36
поделиться

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

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

.
2
ответ дан 10 December 2019 в 00:36
поделиться

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

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

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

1
ответ дан 10 December 2019 в 00:36
поделиться

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

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

1
ответ дан 10 December 2019 в 00:36
поделиться

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

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

0
ответ дан 10 December 2019 в 00:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: