为什么我会犯错误;“拒绝连接”;用Python?(插座)

为什么我会犯错误;“拒绝连接”;用Python?(插座),python,sockets,Python,Sockets,我不熟悉插座,请原谅我完全不懂 我有一个服务器脚本(server.py): 和客户端脚本(client.py): 我转到桌面终端,通过键入以下内容启动脚本: python server.py 之后,我转到笔记本电脑终端并启动客户端脚本: python client.py 但我得到了以下错误: 文件“client.py”,第9行,在 s、 连接((主机、端口)) 文件“/usr/lib/python2.7/socket.py”,第224行,meth格式 返回getattr(self.\u so

我不熟悉插座,请原谅我完全不懂

我有一个服务器脚本(server.py):

和客户端脚本(client.py):

我转到桌面终端,通过键入以下内容启动脚本:

python server.py
之后,我转到笔记本电脑终端并启动客户端脚本:

python client.py
但我得到了以下错误:

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

s、 连接((主机、端口))

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

返回getattr(self.\u 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
这样侦听套接字就不会受到太多限制。否则,侦听可能只发生在一个与本地网络无关的接口上


一个例子可能是它只侦听
127.0.0.1
,这使得无法从其他主机进行连接。

此错误意味着无论出于何种原因,客户端都无法连接到运行服务器脚本的计算机上的端口。这可能是由于一些原因造成的,比如缺少到目的地的路由,但是由于您可以ping服务器,所以情况应该不是这样。另一个原因可能是在客户端和服务器之间的某个地方有一个防火墙——它可能在服务器本身上,也可能在客户端上。考虑到您的网络地址,我假设服务器和客户端都在同一个LAN上,因此不应该涉及任何路由器/防火墙来阻止流量。在这种情况下,我会尝试以下方法:

  • 检查您是否真的在服务器上侦听该端口(这应该告诉您的代码是否按照您认为的那样执行):基于您的操作系统,但在linux上,您可以执行类似于
    netstat-ntulp
  • 如果您正在接受与服务器的连接,请从服务器进行检查:同样基于您的操作系统,但是
    telnet侦听\u IP侦听\u端口
    应该可以完成这项工作
  • 检查是否可以从客户端访问服务器端口,但不使用代码:只需从客户端使用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
我认为这个错误可能与DNS解析有关。 这句话
host=socket.gethostname()
获取主机名,但如果操作系统无法将主机名解析为本地地址,则会出现错误。 Linux操作系统可以修改
/etc/hosts
文件,在其中添加一行。它如下所示('hostname'是socket.gethostname()got)

假设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))
host = socket.gethostbyname("localhost") # Get local machine name
s.connect((host, port))
方法3:

host = socket.gethostbyname("192.168.1.48")
s.bind((host, port))
host = socket.gethostbyname("192.168.1.48") # Get local machine name
s.connect((host, port))
如果在客户端没有完全使用相同的方法,则会出现错误:
socket.error errno 111连接被拒绝。

因此,您必须在客户端使用与在服务器上完全相同的方法来获取主机。例如,对于客户端,您将相应地使用以下方法:

方法1:

host = socket.gethostname()
s.bind((host, port))
host = socket.gethostname() 
s.connect((host, port))
方法2:

host = socket.gethostbyname("localhost")  #Note the extra letters "by"
s.bind((host, port))
host = socket.gethostbyname("localhost") # Get local machine name
s.connect((host, port))
方法3:

host = socket.gethostbyname("192.168.1.48")
s.bind((host, port))
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

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

请注意更改端口号。有时,您只需要更改端口号。当我对语法和函数进行更改时,我经历了这种情况。

我的代码中也遇到了同样的问题,经过几天的搜索,我终于找到了解决方案,问题是函数套接字。gethostbyname(socket.gethostname)在linux中不起作用,因此您必须使用socket.gethostbyname('put the hostname manually')而不是socket.gethostbyname('localhost'),请使用socket.gethostbyname('host')查找ifconfig。

尝试使用。这通常对我有帮助。键入终端
telnet[IP]12397
(将IP替换为
gethostname()
返回的内容)。如果您这样做,您应该会看到
感谢您连接
。如果没有,请告诉我telnet返回了什么。
telnet
对我有效,但我发送的每个命令都会创建一个
HTTP/1.1400错误请求
并关闭连接。sudo apt get install redis-server@PunitSoni是的,这是标准的。如果你看一下,比如说,服务器它提供了一些您想从“任何地方”连接到的服务,例如web服务器和/或邮件和imap服务器,并且您执行
netstat-tulpen
,您会注意到有一些条目像
0.0.0.0:143
::80
。这些条目绑定到“全零”按照aboce注意到的那样寻址并执行。非常感谢。在我开始做这件事之前,我浪费了最后10个小时。我实际上是在尝试在Android手机和Python服务器之间创建套接字。有趣的是,Android模拟器上的连接工作正常,但当我在手机上运行时却没有。我考虑了所有可能发生的事情可能出了问题,但从未想过。本教程()误导了我。对不起,在“启用”一词后返回新行。请记录您建议尝试的内容