2013-04-21 18 views
41

Jestem nowy w Sockets, proszę wybaczyć mój kompletny brak zrozumienia.Dlaczego otrzymuję komunikat "Odmowa połączenia" w Pythonie? (Gniazda)

Mam skrypt serwera (server.py):

#!/usr/bin/python 

import socket #import the socket module 

s = socket.socket() #Create a socket object 
host = socket.gethostname() #Get the local machine name 
port = 12397 # Reserve a port for your service 
s.bind((host,port)) #Bind to the port 

s.listen(5) #Wait for the client connection 
while True: 
    c,addr = s.accept() #Establish a connection with the client 
    print "Got connection from", addr 
    c.send("Thank you for connecting!") 
    c.close() 

i skrypt klienta (client.py):

#!/usr/bin/python 

import socket #import socket module 

s = socket.socket() #create a socket object 
host = '192.168.1.94' #Host i.p 
port = 12397 #Reserve a port for your service 

s.connect((host,port)) 
print s.recv(1024) 
s.close 

idę do mojego terminalu stacjonarnym i uruchomić skrypt wpisując :

python server.py 

po czym idę do terminala przenośnego i uruchomić skrypt klienta:

python client.py 

ale pojawia się następujący błąd:

File "client.py", line 9, in

s.connect((host,port))

File "/usr/lib/python2.7/socket.py", line 224, in meth

return getattr(self._sock,name)(*args)

socket.error: [Errno 111] Connection refused

Próbowałem została, używając różnych numerów portów bezskutecznie. Jednak udało mi się uzyskać nazwę hosta za pomocą tej samej metody ip i gethostname() w skrypcie klienta i mogę pingować pulpit (serwer).

+0

Użyj [] (http://en.wikipedia.org/wiki/ telnet Telnet). Często pomaga mi. Wpisz swój terminal 'telnet [IP] 12397' (zastąp IP tym, co zwraca' gethostname() '). Jeśli to zrobisz, powinieneś zobaczyć "Dziękuję za połączenie". Jeśli nie, pokaż mi, co zwróciło telnet. – Matt3o12

+0

'telnet' działa dla mnie, ale każde polecenie wysyłam tworzy' HTTP/1.1 400 Bad Request' i zamyka połączenie. –

Odpowiedz

53

Zamiast

host = socket.gethostname() #Get the local machine name 
port = 12397 # Reserve a port for your service 
s.bind((host,port)) #Bind to the port 

należy spróbować

port = 12397 # Reserve a port for your service 
s.bind(('', port)) #Bind to the port 

tak, że gniazdo słuchania nie jest zbyt ograniczony. Być może w innym przypadku odsłuchanie odbywa się tylko na jednym interfejsie, który z kolei nie jest powiązany z siecią lokalną.

Jednym z przykładów może być to, że nasłuchuje tylko 127.0.0.1, co uniemożliwia połączenie z innego hosta.

+2

@PunitSoni Tak, to jest standard. Jeśli spojrzysz na, powiedzmy, serwer, który oferuje usługi, z którymi chcesz się łączyć, z "wszędzie", takich jak serwer WWW i/lub serwer poczty i imap, i uruchamiasz 'netstat -tulpen', będziesz zauważ, że istnieją pozycje takie jak '0.0.0.0: 143' lub' ::: 80'. Są one powiązane z adresem "zer" i robią to dokładnie tak, jak zauważyli aboce. – glglgl

+0

Dziękuję bardzo. Zmarnowałem ostatnie 10 godzin, zanim do tego doszedłem. W rzeczywistości próbowałem utworzyć gniazda między Androidem i serwerem Python. Zabawne było to, że połączenie działało dobrze na emulatorze Androida, ale nie działało, gdy uruchomiłem go przez telefon. Rozważyłem wszystko, co mogło pójść źle, ale nigdy o tym nie pomyślałem. Ten tutorial (http://www.tutorialspoint.com/python/python_networking.htm) wprowadził mnie w błąd. – shahensha

5

Ten błąd oznacza, że ​​z dowolnego powodu klient nie może połączyć się z portem na komputerze ze skryptem serwera. Może to być spowodowane przez kilka rzeczy, takich jak brak routingu do miejsca docelowego, ale ponieważ można pingować serwer, nie powinno tak być. Innym powodem może być to, że masz firewall gdzieś pomiędzy twoim klientem a serwerem - może to być na samym serwerze lub na kliencie. Biorąc pod uwagę adresowanie twojej sieci, zakładam, że zarówno serwer jak i klient znajdują się w tej samej sieci LAN, więc nie powinno być żadnego routera, który mógłby blokować ruch. W takim przypadku wypróbowałbym następujące:

  • Sprawdź, czy naprawdę masz port nasłuchujący na serwerze (powinno ci to powiedzieć, czy twój kod wykonuje to, co myślisz powinien): na podstawie twojego systemu operacyjnego, ale na linux można zrobić coś takiego netstat -ntulp
  • czeku z serwera, jeśli przyjmowanie połączeń na serwer: ponownie na podstawie systemu operacyjnego, ale telnet LISTENING_IP LISTENING_PORT powinien wykonać zadanie
  • sprawdzić, czy można uzyskać dostęp do portu serwer od klienta, ale nie używając kodu: wystarczy nam telnet (lub odpowiednie polecenie dla twojego systemu operacyjnego) od klienta

, a następnie daj nam znać.

0
host = socket.gethostname() # Get the local machine name 
port = 12397     # Reserve a port for your service 
s.bind((host,port))   # Bind to the port 

Myślę, że ten błąd może być związany z rozdzielczością DNS. To zdanie host = socket.gethostname() pobiera nazwę hosta, ale jeśli system operacyjny nie może rozpoznać nazwy hosta na adres lokalny, zostanie wyświetlony błąd. System operacyjny Linux może modyfikować plik /etc/hosts i dodawać do niego jedną linię. Wygląda to jak poniżej ("hostname" to socket.gethostname()).

127.0.0.1 hostname 
0

Załóżmy s = socket.socket() Serwer może być związany następujących metod: Metoda 1:

host = socket.gethostname() 
s.bind((host, port)) 

Metoda 2:

host = socket.gethostbyname("localhost") #Note the extra letters "by" 
s.bind((host, port)) 

Metoda 3:

host = socket.gethostbyname("192.168.1.48") 
s.bind((host, port)) 

Jeśli nie dokładnie używać tej samej metody po stronie klienta, otrzymasz błąd: socket.error errno 111 connection refused.

Tak, trzeba użyć po stronie klienta dokładnie taki sam sposób, aby dostać się do przyjmującego, jak to zrobić na serwerze . Na przykład, w przypadku klienta, będzie odpowiednio wykorzystać następujące metody:

Metoda 1:

host = socket.gethostname() 
s.connect((host, port)) 

Metoda 2:

host = socket.gethostbyname("localhost") # Get local machine name 
s.connect((host, port)) 

Metoda 3:

host = socket.gethostbyname("192.168.1.48") # Get local machine name 
s.connect((host, port)) 

Nadzieja rozwiązuje problem.

0

w swojej marki plików server.py: host ='192.168.1.94' zamiast host = socket.gethostname()

1

spróbować tej komendy w terminalu:

sudo ufw enable 
ufw allow 12397 
+0

Przepraszam, wróć do nowej linii po słowie "włącz" –

+0

Proszę udokumentować, co sugerujesz, aby spróbować –

Powiązane problemy