2010-08-05 13 views
5

Donde trabajo que están en necesidad de un protocolo capaz de:Consejos sobre el diseño/implementación de un protocolo propio

  • Iniciar sesión de usuario/cierre de sesión
  • enviar/instrucciones recive archivos
  • enviar/recive
  • Transmisión de audio de envío/recepción (podría usar RTP)
  • Enviar/recibir pequeños archivos XML Usar
  • criptografía para todos aquellos.

Se implementará en java. Entonces tengo algunas preguntas, ya que nunca implementé un protocolo de red todavía.

  1. ¿Es posible utilizar los protocolos existentes para construir este?
  2. ¿Qué herramienta puedo usar para ayudarme a diseñar el protocolo? para "Modelado"
  3. ¿Es posible realizar todo esto, hacerlo solo? Tengo todo el tiempo que necesito para esto.

Tengo una muy buena formación en Java y C++, pero todavía no con los sockets/programación de redes.

Gracias

Respuesta

2

Tengo la sensación de que estás intentando reinventar SIP (si el procesamiento de tu paquete es en su mayoría sin estado y XML es lo suficientemente pequeño como para entrar en los paquetes de 3k <) o XMPP.

Si necesita un inicio de sesión/cierre de sesión orientado a la conexión, y comandos/instrucciones con estado, entonces XMPP probablemente esté más cerca de los requisitos. Además, Jingle extension para XMPP ya se ocupa de la configuración y desmontaje de RTP. Los mensajes XML son triviales para incrustar en paquetes XMPP personalizados (que a su vez son XML) y hay soluciones XMPP conocidas para proxear una transferencia de archivos.

Estoy bastante seguro de que cumple con sus requisitos bastante bien (al menos la forma en que se presentan aquí). Si no tiene que diseñar un protocolo completamente nuevo, probablemente sea más fácil si no lo hace. Además, reutilizar un servidor XMPP existente le permitirá resolver el problema de crear su propio intermediario de mensajes. Hay un servidor OpenFire, que está escrito en Java.

+0

muchas gracias ... Comprobaré Jingle y XMPP – fredcrs

+0

que leí y parece que Smack podría usarse para hacer que mi cliente ... Y debería usar Openfire como servidor. Pero no sé si Smack admite la transmisión, busqué en Google sin éxito. ¿Debería ser esta la mejor manera? – fredcrs

+0

Me refiero a transmisión de audio lo siento. – fredcrs

0

Puede usar http o https. El framework java media contiene una implementación de rtp.

+0

http (s) es horrible en el envío de archivos de gran tamaño/audio, etc. También es sin estado, por lo que sería más difícil crear cosas de inicio de sesión. –

3

Eche un vistazo a Google Protocol Buffers, que generará un protocolo de cable compacto, así como la generación automática de clases de mensajes de Java. Desearía haber oído hablar de él antes de rodar mi propio códec de mensajes usando Java NIO ByteBuffer s.

+0

+1, ese fue un proyecto realmente interesante del que nunca antes había oído hablar. También lancé un códec de mensajes propio con bytebuffers hace un par de años (y a veces era bastante molesto), si hubiera tenido algo como esto podría haber reducido significativamente los tiempos de desarrollo (¡pero hey, funcionó!). Definitivamente echaré un vistazo a esto cuando tenga algo de tiempo libre. Es una lástima que no me sirva para nada en mi trabajo actual (C# y WCF ...). – wasatz

+2

Solo tenga en cuenta que a pesar de que tiene un "protocolo" en el nombre, es solo una forma de (de) serializar los mensajes en un formato binario. Esto es solo un pequeño paso en el diseño de su propio intercambio de mensajes. Necesitarás pensar sobre los estados, la recuperación de errores, lidiar con posibles conflictos/carreras de mensajes, etc. etc. – viraptor

0

Escribir el protocolo desde cero puede requerir mucho trabajo. Eche un vistazo a XMPP.

Si desea escribir su propio protocolo, comience aprendiendo una forma de RPC como JSON o similar, que le facilitará la vida mucho más.

1

No sé si esto es un mal consejo o no, pero lo que suelo hacer por mis aplicaciones de red es crear un objeto Message que contenga una cadena TAG y una cadena CONTENT. La parte CONTENIDO suele ser una cadena JSON y el mensaje en sí también se envía a/desde el servidor como una cadena json.

Cuando el servidor o el cliente recibe un mensaje, lo analiza en un objeto Message. Luego puede verificar la parte TAG del mensaje para ver qué tipo de contenido se encuentra en la parte CONTENIDO del mensaje y decidir qué hacer con él.

Por ejemplo, si TAG == "LOGIN", entonces el CONTENIDO puede ser información de inicio de sesión o similar. Y cuando TAG == "MESSAGE", el CONTENT tal vez sea una cadena json que represente sus parámetros, por ejemplo, quién es el/los destinatario/sy cuál es el contenido del mensaje, etc.

Usted puede hacer usted cifrado y descifrado en las cadenas. Si esta es una manera estúpida de hacerlo, dímelo en un comentario para que pueda aprender :)

También suelo implementar un patrón de diseño de estado en ambos lados, pero al menos en el lado del servidor. Por ejemplo, el servidor comienza en un estado WaitingForLogin. Cuando el cliente inicia sesión cambia a un estado diferente que solo escucha archivos y mensajes de chat como ejemplo. De esta forma, descubrí que es un poco más fácil de administrar.

+0

¡Gracias por compartir tu enfoque! Señaló que estoy en la dirección correcta. –

Cuestiones relacionadas