Thread View: pl.comp.lang.python
7 messages
7 total messages
Started by plushmasta
Tue, 07 Apr 2009 07:40
Serwer nasłuchująco-wysyłający
Author: plushmasta
Date: Tue, 07 Apr 2009 07:40
Date: Tue, 07 Apr 2009 07:40
92 lines
4064 bytes
4064 bytes
Witam,
-Problem główny-
Zbudowanie serwera nasłuchującego (serwer A - localhost, 6666) który
podczas startu otworzy "stałe" połączenie do innego serwera (serwer B
- localhost, 7777).
Gdy klient wyśle dane do serwera A ten (mając stałe połączenie do
serwera B) przesyła dane, odbiera odpowiedź od serwera B i odpowiedz
przesyła do klienta.
Potem znowu : klient wysyła dane, serwer A je odbiera, wysyła do
serwera B, odbiera dane z serwera B i tą odpowiedź śle do klienta. I
tak w kółko. Połączenie do serwera B zamyka się dopiero wtedy gdy
zatrzyma się serwer A.
-Testy-
Rozwiązanie jakie znajduje się poniżej działa prawidłowo. Ale nie
spełnia ono założenia podstawowego. Nie podtrzymuje połączenia do
serwera B lecz otwiera je i zamyka za każdym razem gdy "aktywuje się
"handle".
Problem pojawia się gdy połączenie do serwera B ma być inicjowane na
początku działania serwera A.
Wówczas AHandler powinien wykonywać jedynie operację send oraz recv na
istniejącym już połączeniu do serwera B. Tak się jednak nie dzieje.
Byc może w ogóle to "ślepa ulica" i do problemu należy podejść
inaczej. Proszę o sugestie.
serwer A
->-----------------------------------------------
import SocketServer
from socket import *
class AHandler( SocketServer.StreamRequestHandler ):
def handle(self):
input = self.request.recv(1024)
print "A pytanie: %r" % ( input, )
if (input):
s = socket(AF_INET, SOCK_STREAM)
s.connect(("localhost",7777))
s.send(input)
data = s.recv(1024)
if (data):
print str(data)
self.request.send("A odpowiedz: %r\n" % ( data, ) )
s.close()
server= SocketServer.TCPServer( ("",6666), AHandler )
print "Starting A Server..."
server.serve_forever()
-/-----------------------------------------------
serwer B
->-----------------------------------------------
import SocketServer
class BHandler( SocketServer.StreamRequestHandler ):
def handle(self):
input= self.request.recv(1024)
print "B pytanie: %r" % ( input, )
self.request.send("B odpowiedz: %r" % ( input, ) )
server= SocketServer.TCPServer( ("",7777), BHandler )
print "Starting B Server..."
server.serve_forever()
-/-----------------------------------------------
klient
->-----------------------------------------------
from socket import *
import string
import time
licznik=1
while True:
print "otwarcie polaczenia"
s = socket(AF_INET, SOCK_STREAM)
s.connect(("localhost",6666))
s.send(str(licznik))
data = s.recv(1024)
if (data):
print str(data)
s.close()
time.sleep(1)
licznik =+ licznik+1
-/-----------------------------------------------
Re: Serwer nasłuchująco-wysyłający
Author: Krzysztof Stachlewski
Date: Tue, 07 Apr 2009 09:17
Date: Tue, 07 Apr 2009 09:17
16 lines
1361 bytes
1361 bytes
W dniu 2009-04-07 09:40, plushmasta@gmail.com pisze:
Rozwiązanie jest takie, że nie możesz w kółko
wołać tego:
s = socket(AF_INET, SOCK_STREAM)
s.connect(("localhost",7777))
Zrób to raz a dobrze i zapamiętaj s w zmiennej self.s, czy coś.
I nie wołaj s.close().
Tak jak teraz, to faktycznie, ciągle otwierasz nowe połączenia.
Stach
--
http://stachlewski.info
Re: Serwer nasłuchująco-wysyłający
Author: plushmasta
Date: Tue, 07 Apr 2009 09:49
Date: Tue, 07 Apr 2009 09:49
15 lines
1868 bytes
1868 bytes
On 7 Kwi, 11:17, Krzysztof Stachlewski <st...@fr.pl> wrote:
> W dniu 2009-04-07 09:40, plushma...@gmail.com pisze:
>
> Rozwiązanie jest takie, że nie możesz w kółko
> wołać tego:
>
> s = socket(AF_INET, SOCK_STREAM)
> s.connect(("localhost",7777))
>
> Zrób to raz a dobrze i zapamiętaj s w zmiennej self.s, czy coś.
> I nie wołaj s.close().
Takie testy oczywiscie robilem i niestety problem jest taki, ze wtedy
"send" przechodzi raz a potem juz socket "s" sie sypie i juz nic nie
przechodzi.
Re: Serwer nasłuchująco-wysyłający
Author: Krzysztof Stachlewski
Date: Tue, 07 Apr 2009 14:29
Date: Tue, 07 Apr 2009 14:29
17 lines
1704 bytes
1704 bytes
W dniu 2009-04-07 11:49, plushmasta@gmail.com pisze: > Takie testy oczywiscie robilem i niestety problem jest taki, ze wtedy > "send" przechodzi raz a potem juz socket "s" sie sypie i juz nic nie > przechodzi. Jak trzymasz takie połączenie bardzo długo, to w końcu jest zamykane. Jest tam jakaś flaga do socketów o nazwie w okolicach KEEPALIVE. Spróbuj jej. Powoduje, że system sam co jakiś czas wyśle jakiś pakiet dla podtrzymania połączenia. Przy długich czasach między transmisjami praktyczne będzie to co teraz robisz, czyli nawiązywania połączenia od nowa. Stach -- http://stachlewski.info
Re: Serwer nasłuchująco-wysyłający
Author: Rob Wolfe
Date: Tue, 07 Apr 2009 16:48
Date: Tue, 07 Apr 2009 16:48
49 lines
3018 bytes
3018 bytes
plushmasta@gmail.com writes:
> Witam,
>
> -Problem główny-
> Zbudowanie serwera nasłuchującego (serwer A - localhost, 6666) który
> podczas startu otworzy "stałe" połączenie do innego serwera (serwer B
> - localhost, 7777).
> Gdy klient wyśle dane do serwera A ten (mając stałe połączenie do
> serwera B) przesyła dane, odbiera odpowiedź od serwera B i odpowiedz
> przesyła do klienta.
> Potem znowu : klient wysyła dane, serwer A je odbiera, wysyła do
> serwera B, odbiera dane z serwera B i tą odpowiedź śle do klienta. I
> tak w kółko. Połączenie do serwera B zamyka się dopiero wtedy gdy
> zatrzyma się serwer A.
>
> -Testy-
> Rozwiązanie jakie znajduje się poniżej działa prawidłowo. Ale nie
> spełnia ono założenia podstawowego. Nie podtrzymuje połączenia do
> serwera B lecz otwiera je i zamyka za każdym razem gdy "aktywuje się
> "handle".
> Problem pojawia się gdy połączenie do serwera B ma być inicjowane na
> początku działania serwera A.
> Wówczas AHandler powinien wykonywać jedynie operację send oraz recv na
> istniejącym już połączeniu do serwera B. Tak się jednak nie dzieje.
> Byc może w ogóle to "ślepa ulica" i do problemu należy podejść
> inaczej. Proszę o sugestie.
Jeśli potrzebujesz stałego połączenia między klientem i serwerem,
to `SocketServer` jest generalnie złym wyborem.
`SocketServer` został pomyślany jako mechanizm obsługi _bezstanowych_
protokołów (np. http), czyli działa tak:
1. otwórz połączenie z klientem
2. odczytaj i przetwórz żądanie
3. wygeneruj i wyślij odpowiedź
4. zamknij połączenie
Owszem czasem nawet w http połączenie jest podtrzymywane ('keep-alive'),
ale to jest raczej szczególny przypadek niż reguła i jest dość trudne
w użyciu z `SocketServer`.
Generalnie `SocketServer` nie nadaje się do implemetacji stanowych
protokołów (typu np. ftp).
Czyli pierwsze pytanie jakie się nasuwa, czy to otwarte połączenie
jest na pewno do czegoś potrzebne?
Jeśli tak to pozostaje Ci samodzielna obsługa komunikacji Twojego
protokołu.
RW
Re: Serwer nasłuchująco-wysyłający
Author: syntion
Date: Tue, 07 Apr 2009 18:31
Date: Tue, 07 Apr 2009 18:31
23 lines
2636 bytes
2636 bytes
On 7 Kwi, 16:29, Krzysztof Stachlewski <st...@fr.pl> wrote: > W dniu 2009-04-07 11:49, plushma...@gmail.com pisze: > > > Takie testy oczywiscie robilem i niestety problem jest taki, ze wtedy > > "send" przechodzi raz a potem juz socket "s" sie sypie i juz nic nie > > przechodzi. > > Jak trzymasz takie połączenie bardzo długo, to w końcu jest zamykane. > Jest tam jakaś flaga do socketów o nazwie w okolicach KEEPALIVE. Spróbuj > jej. Powoduje, że system sam co jakiś czas wyśle jakiś > pakiet dla podtrzymania połączenia. > > Przy długich czasach między transmisjami praktyczne będzie > to co teraz robisz, czyli nawiązywania połączenia od nowa. > > Stach > --http://stachlewski.info Nie chodzi o to ze polaczenie mi sie zamyka tylko ze sie "crashuje". Sprobuj lekko zmodyfikowac ten kod jaki przeslalem wczesniej a zrozumiesz o czym mowie. Ja generalnie nie bardzo wiem nawet jak przeslac do klasy AHandler obiekt "s".
Re: Serwer nasłuchująco-wysyłający
Author: plushmasta
Date: Tue, 07 Apr 2009 18:36
Date: Tue, 07 Apr 2009 18:36
11 lines
1896 bytes
1896 bytes
> Jak trzymasz takie połączenie bardzo długo, to w końcu jest zamykane. > Jest tam jakaś flaga do socketów o nazwie w okolicach KEEPALIVE. Spróbuj > jej. Powoduje, że system sam co jakiś czas wyśle jakiś > pakiet dla podtrzymania połączenia. Nie chodzi o to ze polaczenie mi sie zamyka tylko ze sie "crashuje". Sprobuj lekko zmodyfikowac ten kod jaki przeslalem wczesniej a zrozumiesz o czym mowie. Ja generalnie nie bardzo wiem nawet jak przeslac do klasy AHandler obiekt "s".
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads