2011-01-05 14 views
10

Chcę napisać serwer, który może przyjmować wielu klientów w pythonie (skręconym). Jestem już dość znajomy programowania gniazda z standardowym modułem gniazda Pythona, ale tu pojawia się problem .. Myślę, że zakręcony jest naprawdę trudno dostać się do i przeczytałem kilka tutoriali na ten temat. Ale coś, czego naprawdę nie mogę znaleźć, to prosty serwer gniazd, który akceptuje wiele połączeń. Czy ktoś może pomóc? Jeśli brakowało mi kilka cennych informacji w Internecie, proszę dać mi znać, bo jestem ciągnięcie moich włosów ..Serwer skręcony dla wielu klientów

Każda pomoc jest bardzo doceniana,

Andesay

+0

Czy patrzymy na http://stackoverflow.com/questions/1365737/managing-multiple-twisted -client-connections –

+0

Andrew, myślę, że to pytanie różni się od tego, o co prosił Andesay. Czuję to pytanie Andesay'a na bardzo podstawowym poziomie. Proszę, popraw mnie jeśli się mylę. –

Odpowiedz

12

Say, chcesz uruchomić serwer akceptuje połączeń klienckich na porcie 9000:

from twisted.internet import reactor, protocol 

PORT = 9000 

class MyServer(protocol.Protocol): 
    pass 

class MyServerFactory(protocol.Factory): 
    protocol = MyServer 

factory = MyServerFactory() 
reactor.listenTCP(PORT, factory) 
reactor.run() 

a jeśli chcesz przetestować łącząc się z tym serwerem, oto kod dla klienta (aby uruchomić w innym terminalu):

from twisted.internet import reactor, protocol 

HOST = 'localhost' 
PORT = 9000 

class MyClient(protocol.Protocol): 
    def connectionMade(self): 
     print "connected!" 

class MyClientFactory(protocol.ClientFactory): 
    protocol = MyClient 

factory = MyClientFactory() 
reactor.connectTCP(HOST, PORT, factory) 

reactor.run() 

zauważysz kod jest bardzo podobny, tylko używamy fabryki dla serwera i klienta dla klienta, a serwery muszą nasłuchiwać (listenTCP), podczas gdy klient musi się połączyć (connectTCP). Powodzenia!

+0

Powiedziałbym, kod serwera w jednym terminalu i otworzyć wiele nowych terminali i spróbuj połączyć za pomocą 'nc localhost 9000' lub' telnet localhost 9000'. Używanie standardowych klientów pomaga. –

+0

Dzięki za ten wspaniały przykład .. Myślę, że to było właśnie to, czego potrzebowałem .. Mam jedno pytanie jednak .. W przykładzie serwera pod "class MyServer (protocol.Protocol)" piszesz oświadczenie pass. Dlaczego nic nie jest w ta klasa? – Andesay

+0

A w jaki sposób chciałbym przesyłać i odbierać dane? – Andesay

7

myślę, że nie udało nam istotę skręcona . Jeśli utworzysz skręcony serwer gniazda, domyślnie dostępne jest połączenie przez wielu klientów. Zasugerowałem następujące tutoriale, a następnie przeczytałem skręconą dokumentację. Pisz krótkie fragmenty, jak podano w tych samouczkach, aby zrozumieć, co się właściwie dzieje.

  1. Dave Peticola's twisted tutorial
  2. Itamar Shtull-Trauring's twisted presentation
0

Twisted jest niesamowite ramy, ale to (jak często) wynika, że ​​dla rzeczą łatwą może to być dość trudne ...

Oto fakt . Trzeba napisać klasy, która implementuje Resource, a LineReceiver jeśli trzeba, a następnie podłączyć go do reaktora z:

reactor.connectTCP(<HOST>, <PORT>, istance_of_your_class) 
+1

Po odbiciu ta odpowiedź nie ma żadnego sensu. Połączyłeś "zasób" z "ClientFactory" i nie widzę, jak 'connectTCP' jest związany z pytaniem pytającego w * wszystkich *; "akceptuj wiele klientów" brzmi, jakby osoba pytająca pisała * serwer *, a nie klient. Zasoby odnoszą się tylko do HTTP, co ma do czynienia z "LineReceiver" z czymkolwiek i na jakiej klasie mówisz o instancji? – Glyph

Powiązane problemy