为什么在Python中得到错误“连接被拒绝”? (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 ip port = 12397 #Reserve a port for your service s.connect((host,port)) print s.recv(1024) s.close 

我去我的桌面terminal并键入以下命令启动脚本:

 python server.py 

之后,我去我的笔记本电脑terminal,并启动客户端脚本:

 python client.py 

但我得到以下错误:

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

s.connect((主机,端口))

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

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

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

我试过使用不同的端口号无济于事。 但是,我能够在客户端脚本中使用相同的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 

这样监听套接字就不是太受限制了。 也许否则,只能在一个接口上进行监听,而这个接口又与本地networking不相关。

例如,它只能监听127.0.0.1 ,这使得不能从不同的主机进行连接。

此错误意味着无论什么原因,客户端无法连接到运行服务器脚本的计算机上的端口。 这可能是由于很less的事情导致的,比如缺less到目的地的路由,但是由于你可以ping服务器,所以不应该这样。 另一个原因可能是你的客户端和服务器之间有防火墙 – 它可能在服务器本身或客户端上。 鉴于您的networking寻址,我假设服务器和客户端都在同一个局域网,所以不应该有任何路由器可能会阻止stream量。 在这种情况下,我会尝试以下方法:

  • 检查你是否真的在服务器上监听端口(这应该告诉你,如果你的代码做你认为应该):基于你的操作系统,但在Linux上,你可以做一些像netstat -ntulp
  • 从服务器检查,如果你接受到服务器的连接:再次根据你的操作系统,但telnet LISTENING_IP LISTENING_PORT应该做的工作
  • 检查是否可以从客户端访问服务器的端口,但不使用代码:只需从客户端获取telnet(或适用于您的操作系统的命令)

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

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

我认为这个错误可能与DNSparsing有关。 这句话host = socket.gethostname()获取主机名,但是如果操作系统无法将主机名parsing为本地地址,则会出现错误。 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)) 

希望解决这个问题。