2013-04-21 56 views
41

我是新來接,請原諒我完全不理解。爲什麼我在Python中出現錯誤「連接被拒絕」? (插座)

我有一個服務器腳本(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() 

和客戶端腳本(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 

我去我的桌面終端,並通過鍵入啓動腳本:

python server.py 

之後,我去我的筆記本電腦終端,並啓動客戶端腳本:

python client.py 

,但我得到了以下錯誤:

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

我一直在使用不同的端口號無濟於事嘗試。但是,我可以在客戶端腳本中使用相同的ip和gethostname()方法獲取主機名,並且可以ping桌面(服務器)。

+0

嘗試使用[遠程登錄(http://en.wikipedia.org/wiki/遠程登錄)。它經常幫助我。輸入您的終端telnet [IP] 12397'(用'gethostname()'返回的內容替換IP)。如果你這樣做,你應該看到'謝謝你連接'。如果沒有,請告訴我什麼telnet返回。 – Matt3o12 2013-04-21 11:56:32

+0

'telnet'適用於我,但是我發送的每個命令都會創建一個'HTTP/1.1 400 Bad Request'並關閉連接。 – 2015-03-20 17:21:46

回答

53

而不是

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

你應該嘗試

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

,以便監聽套接字是不是太受限制。也許否則,只能在一個接口上進行收聽,而這個接口又與本地網絡無關。

一個示例可以是,它僅監聽127.0.0.1,這使得從不同的主機不可能連接。

+2

@PunitSoni是的,這是標準。如果你看看一個服務器,它提供了一些你想從「無處不在」連接到的服務,比如web服務器和/或郵件和imap服務器,並且執行'netstat -tulpen',你會請注意,有像「0.0.0.0:143」或「::: 80」這樣的條目。這些都綁定到「全零」地址,並按照注意到的那樣完成。 – glglgl 2013-10-30 19:54:53

+0

非常感謝。我在最後10個小時之前浪費了我的時間。我實際上是試圖在Android手機和Python服務器之間創建套接字。有趣的是,這個連接在Android模擬器上運行良好,但是當我在手機上運行它時沒有發生。我考慮過所有可能會出錯的事情,但從來沒有想到這一點。本教程(http://www.tutorialspoint.com/python/python_networking.htm)誤導了我。 – shahensha 2013-12-22 08:44:50

5

此錯誤意味着,無論出於何種原因,客戶端無法連接到電腦上正在運行的服務器腳本的端口。這可能是由於很少的事情造成的,比如缺少到目的地的路由,但由於您可以ping服務器,所以不應該如此。另一個原因可能是您的客戶端和服務器之間有防火牆 - 它可能位於服務器本身或客戶端。考慮到你的網絡地址,我假設服務器和客戶端都在同一個局域網中,所以不應該有任何可能阻塞流量的路由器。在這種情況下,我會嘗試以下方法:

  • 檢查,如果你真的有一個端口偵聽的服務器上(這應該告訴你,如果你的代碼做什麼你認爲它應該):根據您的操作系統,但在Linux上,你可以不喜歡netstat -ntulp
  • 檢查從服務器,如果你接受了連接到服務器:再次根據您的操作系統,但telnet LISTENING_IP LISTENING_PORT應該做的工作
  • 檢查是否可以訪問的端口從客戶端的服務器上,而不是使用的代碼:剛纔我們的遠程登錄(或您的操作系統相應的命令)從客戶

,然後讓我們知道結果。

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 

我覺得這個錯誤可能與DNS解析有關。 這句話host = socket.gethostname()獲取主機名,但如果操作系統無法將主機名解析爲本地地址,則會出現錯誤。 Linux操作系統可以修改/etc/hosts文件,在其中添加一行。它看起來像下面('主機名'是socket.gethostname()得到的)。

127.0.0.1 hostname 
0

假設S = socket.socket() 服務器可以通過下列方法的約束: 方法1:

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

方法2:

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

方法3:

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

如果你不完全相同的方法在客戶端,你會得到錯誤:socket.error errno 111 connection refused.

所以,你必須在客戶端使用完全相同的方法來獲取主機,就像你在服務器上。例如,在客戶端的情況下,將相應地使用以下方法:

方法1:

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

方法2:

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

方法3:

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

希望解決問題。

0
在server.py文件中所作

:中host ='192.168.1.94'代替host = socket.gethostname()

1

在終端試試這個命令:

sudo ufw enable 
ufw allow 12397 
+0

對不起,在「啓用」後返回新行 – 2018-01-07 18:07:50

+0

請記錄您建議嘗試的內容 – 2018-01-29 12:55:48

相關問題