Я реализую некоторый сетевой материал в нашем проекте. Было решено, чтобы коммуникация была очень важна, и мы хотим сделать это синхронно. Таким образом, клиент отправляет что-то, что сервер подтверждает.
Есть ли некоторые общие лучшие практики для взаимодействия между клиентом и сервером. Например, если нет ответа с сервера, клиент должен автоматически повторить? Должен быть период тайм-аута, прежде чем он повторит? Что происходит, если подтверждение перестало работать? В какой точке мы повреждаем соединение и снова соединяемся? Разве существует ли некоторый материал? Я сделал поиски, но ничто действительно не подходит.
Я ищу лучшие практики в целом. Я реализую это в c# (вероятно, с сокетами) поэтому, если существует что-нибудь .NET, конкретный затем сообщенный мне также.
Первое правило сети - вы отправляете сообщения, а не вызываете функции.
Если вы подходите к сети таким образом и не делаете вид, что можете вызывать функции удаленно или иметь «удаленные объекты», все будет в порядке. У вас никогда не бывает реальной «вещи» по ту сторону сетевого подключения - то, что у вас есть, по сути, является ее изображением.
Все , которые вы получаете из сети, - это старые данные. Вы никогда не в курсе. Из-за этого вам необходимо убедиться, что ваши сообщения несут правильную семантику - например, вы можете увеличивать или уменьшать что-либо на значение, вы не должны устанавливать его значение на текущее значение плюс или минус другое (поскольку текущее значение может изменится к тому времени, когда ваше сообщение будет там).
Если клиент и сервер написаны на .NET/C#, я бы рекомендовал WCF вместо raw sockets, так как это избавит вас от большого количества кода с сериализацией и десериализацией, синхронизацией сообщений и т.д.
Возможно, это не совсем отвечает на ваш вопрос о лучших практиках ;-)
.Первое, что нужно сделать, это охарактеризовать вашу конкретную сеть с точки зрения скорости, вероятности потери сообщений, номинального и пикового трафика, узких мест, mtbf клиента и сервера, ...
Тогда и только тогда вы решаете, что вам нужно для вашего протокола. Во многих случаях вам не нужны сложные механизмы обработки ошибок, и вы можете надежно реализовать службу с помощью простого UDP.
В некоторых случаях вам нужно будет создать что-то гораздо более надежное, чтобы поддерживать согласованное глобальное состояние между несколькими машинами, подключенными через сеть, которым вы не можете доверять.
Самое важное, что я нашел, это то, что сообщения всегда должны быть stateless (почитайте о REST, если для вас это ничего не значит)
Например, если ваше приложение отслеживает количество отправлений по сети, не отправляйте инкрементные обновления (+x), а всегда отправляйте новое общее количество.
Я думаю, вы должны узнать, что обычно думают о сетевом программировании:
1. Розетка (конечно).
2. Вилка и нарезка резьбы.
3. Процесс блокировки (используйте мьютекс, семафор или другие).
Надеюсь на эту помощь ..