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

She*_*don 52 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()
Run Code Online (Sandbox Code Playgroud)

和客户端脚本(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
Run Code Online (Sandbox Code Playgroud)

我转到桌面终端并输入以下命令启动脚本:

python server.py
Run Code Online (Sandbox Code Playgroud)

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

python client.py
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

文件"client.py",第9行,in

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

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

return getattr(self._sock,name)(*args)

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

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

glg*_*lgl 67

代替

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

你应该试试

port = 12397 # Reserve a port for your service
s.bind(('', port)) #Bind to the port
Run Code Online (Sandbox Code Playgroud)

这样监听套接字不会受到太多限制.也许否则,监听仅发生在一个接口上,而接口又与本地网络无关.

一个例子可能是它只听127.0.0.1,这使得从不同的主机连接变得不可能.

  • @PunitSoni是的,这是标准的.如果你看一下服务器提供你想从"无处不在"连接的服务,比如web服务器和/或邮件和imap服务器,你执行`netstat -tulpen`,你会注意有些条目如`0.0.0.0:143`或`::: 80`.这些都与"全零"地址绑定,并且完全按照注意到的那样执行. (2认同)

Spa*_*kMe 8

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

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

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