¿Cuál es la forma más fácil y eficiente de combinar UDP y RPC en Java?

Actualmente estoy considerando usar java en uno de mis proyectos (por razones no relacionadas con la creación de redes). En este momento estoy usando C ++ y un protocolo personalizado construido sobre UDP. Mi problema aquí es que, si bien la eficiencia adicional es buena para enviar grandes cantidades de datos en tiempo real, prefiero tener algo parecido a las RPC para "acciones lógicas" puras como el inicio de sesión. Sin embargo, los RPC en C ++ son difíciles de hacer, ya que el C ++ estándar en sí mismo no tiene noción de serialización.

En otra respuesta, encontré el RMI de Java, que parece ser similar a los RPC, pero no pude encontrar qué tan eficiente / sensible es, ni si podría conectarse a mi socket UDP existente, ya que no quiero tener dos puertos se abren en mi programa de servidor.

Alternativamente, dado que creo que Java tiene serialización, podría implementar RPC yo mismo, dependiendo de lo sencillo que sea deserializar un flujo arbitrario de objetos en Java. Aún así, si esto me obligara a pasar días aprendiendo los elementos intrínsecos de Java, esta no sería una opción para mí.

preguntado el 27 de agosto de 11 a las 16:08

Esto realmente no importa por nada más que por mi propia curiosidad, pero ¿qué protocolo UDP personalizado estás usando? ¿Hiciste el tuyo propio o estás usando algo como UDT (udt.sourceforge.net)? -

Es mi propio protocolo construido sobre UDP. Agrega algunas características de TCP, para ser precisos, asegura la integridad de los mensajes, vuelve a solicitar los paquetes que faltan y permite a los manejadores de mensajes hacer cumplir opcionalmente el pedido de paquetes en tiempo de ejecución. Está construido específicamente para juegos. Hasta donde yo sé, UDT se especializa en un área diferente, sin embargo, la biblioteca lidgren para C # parece ser similar a la que yo escribo. -

Eso es muy interesante. Gracias. -

3 Respuestas

Si está interesado en RPC, siempre hay XML-RPC y JSON-RPC, los cuales tienen implementaciones de C ++ de código abierto / libre. Desafortunadamente, la mayor parte de mi desarrollo ha sido en Java, por lo que no puedo hablar de cuán utilizables o efectivos son, pero podría ser algo a considerar, ya que parece que ya ha trabajado un poco en C ++ y se siente cómodo con él. . También tienen implementaciones de Java, por lo que es posible que incluso pueda admitir aplicaciones Java y C ++ con XML-RPC o JSON-RPC, si desea seguir ese camino.

El único inconveniente es que parece que la mayoría de estos utilizan conexiones HTTP. Una de las cosas que quería hacer era reutilizar la conexión existente. Ahora, no he examinado todas las implementaciones, pero es posible que las dos que miré no cumplan con ese requisito. El peor de los casos es que quizás puedas tener algunas ideas. En el mejor de los casos, podría haber otra implementación en algún lugar que haga lo que necesita y ahora tiene un punto de partida para encontrarla.

Respondido 27 ago 11, 20:08

El uso de RPC como abstracción no excluye el uso de UDP como capa de transporte: RMI es una abstracción de RPC que generalmente usa TCP bajo el capó (la última vez que miré).

Sugeriría simplemente codificar una capa de Java para hablar con su protocolo UDP: puede usar cualquiera de las muchas bibliotecas para hacerlo y no tiene que descartar todo su trabajo existente. Si desea envolver una capa RPC alrededor de su protocolo, no hay razón por la que no pueda hacerlo: cree un login método que envía el paquete UDP de inicio de sesión, recibe la respuesta adecuada y la devuelve.

Respondido 27 ago 11, 20:08

Parece una buena idea, pero al no tener experiencia con Java, parece que no puedo encontrar la documentación / bibliotecas adecuadas. ¿Podría señalarme un recurso para obtener más información? - Cib

Si se trata de un proyecto remotamente serio, probablemente debería echarle un vistazo Netty.

Es una gran biblioteca para desarrollar sistemas en red, tiene mucho uso de producción comprobado y es muy adecuada para cosas como la comunicación cliente-servidor TCP o UDP. No iría a reinventar esta rueda a menos que realmente tengas que hacerlo :-)

Como beneficio adicional, también tienen buenos ejemplos y documentación.

Respondido 27 ago 11, 20:08

La biblioteca parece interesante, pero no pude encontrar ninguna mención de RPC. Además, solo quiero dos "codificaciones", objetos binarios y serializados, por lo que una canalización completa para decodificar / codificar me parece excesiva. - Cib

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.