socket servidor recibir protocolo enviar datos crear conectar con computadoras como cliente java c++ protocols

servidor - sockets en java enviar y recibir



¿Cómo implementar un protocolo de red? (8)

Aquí hay una pregunta genérica. No estoy en busca de la mejor respuesta, solo me gustaría que expreses tus prácticas favoritas.

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 mejor práctica que se utiliza en la programación de protocolos complejos, fácil de mantener y extender y muy legible.

¿Cuáles son tus sugerencias?


¿Por qué no usar XML como su protocolo? Puede encapsular y clasificar todas sus piezas de datos dentro de nodos XML


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 comenzar, debe decidir en qué espacio de aplicación se encuentra y luego definir las acciones que se deben tomar. 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.


Finite State Machine es lo que quieres

FSM

Así que define un conjunto completo de estados en los que puede estar como receptor o emisor (inactivo, connecting_phase1, connecting_phase2, paquete esperado, ...)

A continuación, defina todos los eventos posibles (llega el paquete1, la red se cierra, ...)

finalmente tiene una tabla que dice ''cuando en el estado x y el evento n pasa, haga la función y la transición al estado q'' - para cada estado y evento (muchos serán nulos o dúplex)

Editar - cómo hacer un FSM (boceto)

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 está lleno de sintaxis inválida, pero espero que entiendas la deriva


Haga clic con el botón derecho en el icono de conexión de red en la bandeja del sistema. Haz clic en Solucionar problemas. El solucionador de problemas puede encontrar y solucionar el problema, en este caso, puede comenzar rápidamente con su negocio. Si el solucionador de problemas no puede solucionar el problema de Winsocks, es posible que aparezca un error con el siguiente aspecto: "Faltan uno o más protocolos de red en esta computadora".


Lea sobre el patrón de diseño de estado para aprender cómo evitar muchas declaraciones de cambio.

"a veces lo que sale tiene un" punto ciego ", me refiero a los estados del protocolo que no se han cubierto ..."

El estado puede ayudar a evitar las lagunas. No puede garantizar un buen diseño, aún tienes que hacer eso.

"... como 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: debe escribir líneas de código para cubrir todas las situaciones posibles.

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



Si está utilizando Java, considere buscar Apache MINA , su documentación y muestras deberían inspirarlo de la manera correcta.


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 son las especificaciones del protocolo Gnutella