2011-09-03 18 views
5

Estoy buscando una biblioteca RPC en Java o Python (se prefiere Python) que usa TCP. Se debe apoyar:RPC asíncrona bidireccional

  • asíncrono
  • bidireccional
  • RPC
  • Una especie de bucle de eventos (con devoluciones de llamada o similares)

alguna recomendación? He buscado cosas como bjsonrpc, que parecían ser el tipo correcto de cosas, sin embargo, no parecía posible para el servidor identificar qué conexiones; por lo tanto, si un usuario se ha identificado a sí mismo y recibe una solicitud de otro usuario para enviar un mensaje a ese usuario, no expone la conexión de ese usuario para que podamos enviarle el mensaje.

Respuesta

6

Usted debería salir Twisted. Es un framework de red Python basado en eventos que tiene una implementación de un bucle de eventos (denominado "reactor") que admite puertos de finalización select, poll, epoll, kqueue y E/S, y media llamadas asincrónicas con objetos llamados Deferreds

En cuanto a su requisito de RPC, tal vez debería consultar la biblioteca PB de Twisted o AMP.

1

soy el autor de bjsonrpc. Estoy seguro de que es posible hacer lo que quieras con él.

Algunas cosas pueden estar mal documentadas o tal vez se necesiten algunos ejemplos.

Pero, en resumen, los controladores pueden almacenar estados internos (como autenticados o no, o tal vez nombre de usuario). Desde cualquier controlador, puede acceder a la clase "Conexión", que tiene el socket en sí.

Parece que quieres algo así como un chat como ejemplo. Hice algo similar en el pasado. Intentaré agregar un ejemplo de chat para una nueva versión.

estados internos se explican aquí: http://packages.python.org/bjsonrpc/tutorial1/index.html#stateful-server

Deben ser utilizados para la autenticación (pero aún no se proporciona ningún método de autenticación estándar).

Sobre cómo llegar a la clase de conexión desde el controlador, eso aún no está documentado (lo siento), pero a veces se usa en los ejemplos dentro del código fuente. Por ejemplo, contiene example1-server.py esta función pública:

def gettotal(self): 
    self._conn.notify.notify("total") 
    return self.value_total 

BaseHandler._conn representa la conexión de ese usuario. Y es exactamente la misma clase que se obtiene cuando se conecta:

conn = bjsonrpc.connect(host=host,port=port,handler_factory=MyHandler) 

Por lo tanto, puede almacenar las conexiones para los usuarios registrados en una variable global, y luego llamar a cualquier método de cliente que desea.

+0

¿Puede hacer que el servidor empuje al cliente? Si es así, ¿hay algún ejemplo en alguna parte? –

1

Estoy involucrado en el desarrollo de Versile Python (VPy) que proporciona las capacidades que usted está solicitando.Actualmente está disponible como versiones de desarrollo destinadas principalmente a las pruebas, pero es posible que desee verificarlo.

En cuanto a la identificación de usuarios, puede configurar métodos remotos para recibir un objeto de contexto que habilite el método para recibir información sobre un usuario autenticado, utilizando una sintaxis similar a este código de borrador.

from versile.quick import * 

@doc 
class MessageBox(VExternal): 
    """Dispatches IM messages.""" 
    @publish(show=True, doc=True, ctx=True) 
    def send_message(self, msg, ctx=None): 
     """Sends a message to the message box""" 
     if ctx.identity is None: 
      raise VException('No authenticated user') 
     else: 
      # do something ... 
      pass