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

时间:2013-04-21 11:49:47

标签: python sockets

我是Sockets的新手,请原谅我完全缺乏理解。

我有一个服务器脚本(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

但是我收到以下错误:

  

文件“client.py”,第9行,

     

s.connect((host,port))

     

文件“/usr/lib/python2.7/socket.py”,第224行,在meth

     

返回getattr(self._sock,name)(* args)

     

socket.error:[Errno 111]拒绝连接

我尝试使用不同的端口号无济于事。但是,我能够在客户端脚本中使用相同的ip和gethostname()方法获取主机名,我可以ping桌面(服务器)。

9 个答案:

答案 0 :(得分:66)

而不是

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,这使得从不同的主机连接变得不可能。

答案 1 :(得分:8)

此错误表示无论出于何种原因客户端无法连接到运行服务器脚本的计算机上的端口。这可能是由少数事情引起的,例如缺少到目的地的路由,但由于您可以ping服务器,情况应该不是这样。另一个原因可能是您的客户端和服务器之间有防火墙 - 它可能位于服务器本身或客户端上。鉴于您的网络寻址,我假设服务器和客户端都在同一个局域网上,因此不应该涉及任何阻止流量的路由器。在这种情况下,我会尝试以下方法:

  • 检查你是否真的在服务器上监听该端口(这应该告诉你你的代码是否符合你的想法):基于你的操作系统,但在Linux上你可以做netstat -ntulp
  • 检查服务器,如果您正在接受与服务器的连接:再次基于您的操作系统,但telnet LISTENING_IP LISTENING_PORT应该完成工作
  • 检查您是否可以从客户端访问服务器的端口,但不使用代码:只需我们从客户端使用telnet(或适用于您的操作系统的命令)

然后让我们知道调查结果。

答案 2 :(得分:1)

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文件,在其中添加一行。它看起来像下面('hostname'是socket.gethostname()得到的)。

127.0.0.1   hostname

答案 3 :(得分:1)

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

希望能解决问题。

答案 4 :(得分:1)

在终端尝试此命令:

sudo ufw enable
ufw allow 12397

答案 5 :(得分:0)

在您的server.py文件中

make:host ='192.168.1.94'而不是host = socket.gethostname()

答案 6 :(得分:0)

我能够ping通我的连接,但仍然收到“连接被拒绝”错误。原来我在自我检查!那就是问题所在。

答案 7 :(得分:0)

注意更改端口号。有时,您只需要更改端口号。当我对语法和功能进行更改时,我就体验到了这一点。

答案 8 :(得分:0)

我在我的代码中遇到了同样的问题,经过几天的搜索,我终于找到了解决方案,问题是函数 socket.gethostbyname(socket.gethostname) 在 linux 中不起作用,所以你必须使用 socket.gethostbyname('put the hostname manual') 而不是 socket.gethostbyname('localhost'),使用 socket.gethostbyname('host') 查看 ifconfig。