2010-03-15 13 views
32

Aquí hay una pregunta genérica. No estoy en busca de la mejor respuesta, solo me gustaría que expreses tus prácticas favoritas.¿Cómo implementar un protocolo de red?

Quiero implementar un protocolo de red en Java (pero esta es una pregunta bastante general, me enfrenté a los mismos problemas en C++), esta no es la primera vez, como lo he hecho antes. Pero creo que me falta una buena forma de implementarlo. De hecho, generalmente se trata de intercambiar mensajes de texto y algunos búferes de bytes entre hosts, almacenar el estado y esperar hasta que llegue el siguiente mensaje. El problema es que generalmente termino con un montón de cambios y más o menos complejas si las declaraciones reaccionan a diferentes estados/mensajes. Todo esto generalmente se complica y es difícil de mantener. Sin mencionar que a veces lo que sale tiene algún "punto ciego", me refiero a los estados del protocolo que no han sido cubiertos y que se comportan de una manera impredecible. Traté de escribir algunas clases de máquina de estado, que se encargan de verificar los estados de inicio y fin de cada acción de forma más o menos inteligente. Esto hace que programar el protocolo sea muy complicado ya que tengo que escribir líneas y líneas de código para cubrir todas las situaciones posibles. Lo que me gustaría es algo así como un buen patrón, o una buena práctica que se utiliza en la programación de protocolos complejos, fácil de mantener y ampliar y muy legible.

¿Cuáles son sus sugerencias?

Respuesta

15

Lea en el Estado patrón de diseño para aprender a evitar muchas declaraciones de cambio.


"a veces lo que sale tiene algún 'punto ciego', me refiero a estados del protocolo que no ha sido abordado ..."

Estado puede ayudar a evitar vacíos. No puede garantizar un buen diseño, aún tienes que hacer eso.

"... ya que tengo que escribir líneas y líneas de código para cubrir todas las situaciones posibles".

Esto no debe considerarse una carga o un problema: Usted debe escribir líneas de código para cubrir todas las situaciones posibles.

El estado puede ayudar porque puede aprovechar la herencia. No puede garantizar un buen diseño, aún tienes que hacer eso.

+0

En el libro "Desing Patterns" (http://en.wikipedia.org/wiki/Design_Patterns) este patrón se aplica al problema involucrado. – Dmitry

+0

He echado un vistazo a la wikipedia y parece muy inteligente y resolvería muchos problemas que tengo. Debería comprar ese maldito libro de Patrones de Diseño ... :) – gotch4

+0

@ gotch4 - Navegar a través de una buena librería. GOF es uno de esos artículos en los que se supone que debes hacer una genuflexión en público, pero la verdad es que ahora hay mejores libros de patrones. La mayoría cubrirá el patrón del estado, así que compre uno con el que se sienta cómodo. – Duck

1

Si está utilizando Java, considere consultar Apache MINA, es la documentación y las muestras deben inspirarlo de la manera correcta.

6

El diseño de un protocolo generalmente se trata del espacio de la aplicación en el que está trabajando. Por ejemplo, http tiene que ver con el manejo de páginas web, gráficos y publicaciones, mientras que FTP se trata de transferir archivos.

En resumen, para empezar, debe decidir en qué espacio de aplicación se encuentra, y luego definir las acciones que deben tomarse. Entonces, finalmente, antes de comenzar a diseñar su protocolo real, debe buscar seriamente otra pila de protocolos que haga lo que quiere hacer y evitar implementar una pila de protocolos en serio. Solo después de que hayas determinado que algo más construido previamente no funcionará para ti, deberías comenzar a construir tu propia pila de protocolos.

3

máquina de estados finitos es lo que quiere

FSM

Así que definen un montón de estados que puede estar en como un receptor o remitente (inactivo, connecting_phase1, connecting_phase2, paquete esperado, .. .)

a continuación, defina todos los eventos posibles (packet1 llega, cierra netos, ...)

finalmente tiene una tabla que dice 'cuando se encuentra en estado x n y el evento ocurre hacer func transición a estado yy q '- para cada estado y evento (muchos será nulo o DUP)

Editar - cómo hacer un FSM (esbozo)

struct FSMNode 
{ 
     int m_nextState; 
     void (m_func*); 
} 
FSMNode states[NUMSTATES][NUMEVENTS]= 
    { // state 0 
     {3, bang}, // event 0 
     {2,wiz}, 
     {1, fertang} 
    } 
    { 
     {1, noop}, // event 0 
     {1, noop}, 
     {3, ole} 
    } 
    ....... 
    FSMNode node = states[mystate][event]; 
    node.m_func(context); 
    mystate = node.m_nextState; 

Estoy seguro de que esto está lleno de sintaxis no válida - pero espero obtienes la deriva

+0

por supuesto que sé esto. Lo que quiero saber son las mejores prácticas para implementar ese FSM y la tabla ... esa es mi verdadera pregunta – gotch4

2

¿Por qué no utilizar XML como tu protocolo? Puede encapsular y categorizar todas sus piezas de datos dentro de los nodos XML

+0

Ese no es el problema ... Sé que debo implementar codecs ... – gotch4

+0

Lo sugerí porque es un formato abierto utilizado ampliamente en Internet hoy. No digo que ahora no sepas cómo implementar códecs. Solo intento ahorrar algo de tiempo, como me sucedió en proyectos del mundo real en los que elegí este formato de protocolo. – Andres

+0

De hecho, esta es mi elección habitual ... pero mi preocupación no es sobre el formato de los datos, sino más bien sobre el mantenimiento y la implementación del estado del protocolo. – gotch4

3

En C++ puede usar la biblioteca Boost :: Spirit para analizar su mensaje de protocolo fácilmente. La única "dificultad" es definir la gramática de su protocolo de mensajes. Eche un vistazo al código fuente de Gnutella para ver cómo resuelven este problema. Aquí http://www9.limewire.com/developer/gnutella_protocol_0.4.pdf es las especificaciones de protocolo Gnutella

Cuestiones relacionadas