为什么我在Python中出现错误“连接被拒绝”? (插座)

问题描述:

我是新来接,请原谅我完全不理解。为什么我在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

而不是

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

此错误意味着,无论出于何种原因,客户端无法连接到电脑上正在运行的服务器脚本的端口。这可能是由于很少的事情造成的,比如缺少到目的地的路由,但由于您可以ping服务器,所以不应该如此。另一个原因可能是您的客户端和服务器之间有防火墙 - 它可能位于服务器本身或客户端。考虑到你的网络地址,我假设服务器和客户端都在同一个局域网中,所以不应该有任何可能阻塞流量的路由器。在这种情况下,我会尝试以下方法:

  • 检查,如果你真的有一个端口侦听的服务器上(这应该告诉你,如果你的代码做什么你认为它应该):根据您的操作系统,但在Linux上,你可以不喜欢netstat -ntulp
  • 检查从服务器,如果你接受了连接到服务器:再次根据您的操作系统,但telnet LISTENING_IP LISTENING_PORT应该做的工作
  • 检查是否可以访问的端口从客户端的服务器上,而不是使用的代码:刚才我们的远程登录(或您的操作系统相应的命令)从客户

,然后让我们知道结果。

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 

假设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)) 

希望解决问题。

在server.py文件中所作

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

在终端试试这个命令:

sudo ufw enable 
ufw allow 12397 
+0

对不起,在“启用”后返回新行 – 2018-01-07 18:07:50

+0

请记录您建议尝试的内容 – 2018-01-29 12:55:48