2010-03-17 11 views
6

Estoy implementando algunas cosas de redes en nuestro proyecto. Se ha decidido que la comunicación es muy importante y queremos hacerlo de forma sincrónica. Entonces el cliente envía algo que el servidor reconoce.¿Hay algunas mejores prácticas generales de programación de red?

Existen algunas mejores prácticas generales para la interacción entre el cliente y el servidor. Por ejemplo, si no hay una respuesta del servidor, ¿debería el cliente volver a intentar automáticamente? ¿Debería haber un período de tiempo de espera antes de volver a intentar? ¿Qué sucede si falla el reconocimiento? ¿En qué punto rompemos la conexión y volvemos a conectar? ¿Hay algún material? He hecho búsquedas pero nada realmente está por venir.

Estoy buscando las mejores prácticas en general. Estoy implementando esto en C# (probablemente con sockets) así que si hay algo específico de .Net, por favor háganmelo saber también.

+1

http://stackoverflow.com/questions/2368580/socket-protocol-fundamentals puede ser de su interés. –

Respuesta

6

Primera regla de la red: está enviando mensajes, no está llamando a funciones.

Si se acerca a la red de esa manera, y no pretende que puede llamar a las funciones de forma remota o tener "objetos remotos", estará bien. Nunca tiene una "cosa" real en el otro lado de la conexión de red; lo que tiene es básicamente una imagen de esa cosa.

Todo que obtienes de la red son datos antiguos. Usted es nunca al día. Debido a esto, debe asegurarse de que sus mensajes tengan la semántica correcta; por ejemplo, puede incrementar o disminuir algo por un valor, no debe establecer su valor en el valor actual más o menos otro (ya que el valor actual puede cambiar cuando llegue tu mensaje).

2

Si el cliente y el servidor están escritos en .NET/C# Yo recomendaría WCF insted de conexiones en crudo, ya que le una salva de una gran cantidad de código de plomería con la serialización y deserialización, la sincronización de mensajes, etc.

Que tal vez no responda realmente a su pregunta sobre las mejores prácticas ;-)

1

Lo primero que debe hacer es caracterizar su red específica en términos de velocidad, probabilidad de pérdida de mensajes, tráfico nominal y máximo, cuellos de botella, cliente y servidor MTBF, ...

Entonces y solo entonces usted decide lo que necesita para nuestro protocolo En muchos casos, no necesita sofisticados mecanismos de manejo de errores y puede implementar de manera confiable un servicio con UDP simple.

En algunos casos, tendrá que construir algo mucho más robusto para mantener un estado global coherente entre varias máquinas conectadas a través de una red en la que no puede confiar.

1

Lo más importante que he encontrado es que los mensajes deben ser siempre sin estado (leer sobre RESTO si esto no significa nada para ti)

Por ejemplo, si su aplicación monitoriza el número de envíos a través de una red no envíe incrementales actualizaciones (+ x) pero siempre el nuevo total.

+0

Eso tiene perfecto sentido. Buen consejo. Afortunadamente para nosotros, nuestros mensajes son apátridas. Esto es más por coincidencia que por diseño :) – uriDium

+0

¡Bueno para ti! Recientemente tuve que cambiar de forma retrospectiva una aplicación que tenía mensajes de alternancia para todo tipo de cosas, que con el tiempo siempre se confundían. –

+0

Stateless es una buena guía general, pero no * siempre * obligatoria. Algunos escenarios realmente demandan mensajes no apátridas, depende de la situación. Sin embargo, ser apátrida primero es una gran heurística. Y algo así como un "mensaje de alternar" es intrínsecamente malo. Por otro lado, como señalé en mi respuesta, algo como "incremento" es a menudo exactamente lo que quieres, ya que siempre hará lo correcto en el servidor (frente a "establecer en 5" si crees que el valor actual es 4) – kyoryu

0

En una opinión común acerca de la programación en red, creo que debería aprender sobre: ​​
1. Toma (por supuesto).
2. Tenedor y roscado.
3. Proceso de bloqueo (use mutex o semáforo u otros).

Espero que ayude ..

+0

Hola, gracias pero no realmente. Todo eso está bien. Solo buscaba algunas pautas generales. Por ejemplo, usos de ACK, etc. – uriDium

+0

En lugar de aprender a enhebrar, aprendería sobre IO sin bloqueo (si funciona a nivel de socket, eso es). – kyoryu

Cuestiones relacionadas