2011-09-03 19 views
5

Szukam biblioteki RPC w Javie lub Pythonie (preferowany jest Python), który używa TCP. Powinien on wspierać:Asynchroniczny dwukierunkowy RPC

  • Asynchronous
  • dwukierunkowa
  • RPC
  • jakiejś pętli zdarzeń (z wywołania zwrotne lub podobny)

Wszelkie zalecenia? Wyglądałem jak bjsonrpc, który wydawał się być właściwym rodzajem, jednak serwer nie był w stanie określić, które połączenia; więc jeśli użytkownik sam się zidentyfikował i żądanie pochodzi od innego użytkownika, aby wysłać wiadomość do tego użytkownika, nie narazi tego połączenia, więc możemy wysłać wiadomość.

Odpowiedz

6

powinno się sprawdzić Twisted. Jest to oparte na zdarzeniach środowisko Pythona oparte na zdarzeniach, które zawiera implementację pętli zdarzeń (zwanej "reaktorem") obsługującej porty do wybierania, ankiety, epoli, kingsue i I/O oraz pośredniczące asynchroniczne połączenia z obiektami o nazwie Deferreds

Co do wymagań RPC, być może powinieneś sprawdzić bibliotekę Twisted's PB lub AMP.

1

Jestem autorem bjsonrpc. Jestem pewien, że można robić z tym, co chcesz.

Niektóre rzeczy mogą być słabo udokumentowane lub mogą być potrzebne przykłady.

Ale w skrócie, Handler może przechowywać wewnętrzne stany (jak uwierzytelniony lub nie, lub może nazwa użytkownika). Z dowolnego programu obsługi można uzyskać dostęp do klasy "Połączenie", która ma samo gniazdo.

Wygląda na to, że chcesz mieć coś na czacie. Zrobiłem coś podobnego w przeszłości. Spróbuję dodać przykład czatu do nowej wersji.

stany wewnętrzne są wyjaśnione tutaj: http://packages.python.org/bjsonrpc/tutorial1/index.html#stateful-server

Powinny one być wykorzystywane do uwierzytelniania (ale nie standardowa metoda uwierzytelniania jest jeszcze dostarczone).

Sposób, w jaki można uzyskać dostęp do klasy połączenia z obsługi, która nie jest jeszcze udokumentowana (przepraszam), ale jest używana czasami w przykładach wewnątrz kodu źródłowego. Na przykład example1-server.py zawiera tę publiczną funkcję:

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

BaseHandler._conn reprezentuje połączenie dla tego użytkownika. I jest dokładnie taka sama klasa uzyskać po podłączeniu:

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

Tak, można przechowywać połączeń dla zalogowanych użytkowników w zmiennej globalnej, a później zadzwonić jakikolwiek sposób klient chcesz.

+0

Czy można zrobić z serwerem do klienta, jeśli tak, czy istnieje gdzieś przykład? –

1

Jestem zaangażowany w opracowywanie Versile Python (VPy), który zapewnia żądane funkcje.Jest on obecnie dostępny jako wersje rozwojowe przeznaczone głównie do testowania, jednak możesz to sprawdzić.

Jeśli chodzi o identyfikowanie użytkowników, można skonfigurować metody zdalnego odbierania obiektu kontekstowego, który umożliwia otrzymywanie informacji o uwierzytelnionym użytkowniku za pomocą składni podobnej do tej wersji roboczej kodu.

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