为什么我在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桌面(服务器)。
而不是
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
,这使得从不同的主机不可能连接。
@PunitSoni是的,这是标准。如果你看看一个服务器,它提供了一些你想从“无处不在”连接到的服务,比如web服务器和/或邮件和imap服务器,并且执行'netstat -tulpen',你会请注意,有像“0.0.0.0:143”或“::: 80”这样的条目。这些都绑定到“全零”地址,并按照注意到的那样完成。 – glglgl 2013-10-30 19:54:53
非常感谢。我在最后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))
希望解决问题。
:中host ='192.168.1.94'
代替host = socket.gethostname()
在终端试试这个命令:
sudo ufw enable
ufw allow 12397
对不起,在“启用”后返回新行 – 2018-01-07 18:07:50
请记录您建议尝试的内容 – 2018-01-29 12:55:48
尝试使用[远程登录(http://en.wikipedia.org/wiki/远程登录)。它经常帮助我。输入您的终端telnet [IP] 12397'(用'gethostname()'返回的内容替换IP)。如果你这样做,你应该看到'谢谢你连接'。如果没有,请告诉我什么telnet返回。 – Matt3o12 2013-04-21 11:56:32
'telnet'适用于我,但是我发送的每个命令都会创建一个'HTTP/1.1 400 Bad Request'并关闭连接。 – 2015-03-20 17:21:46