当前位置: 首页 > 知识库问答 >
问题:

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

古扬
2023-03-14

我是新来的套接字,请原谅我完全缺乏理解。

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

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

插座错误:[Errno 111]连接被拒绝

我试过使用不同的端口号,但没有用。然而,我能够在客户端脚本中使用相同的ip和gethostname()方法获得主机名,并且我能够ping桌面(服务器)。

共有3个答案

漆雕嘉茂
2023-03-14

假设s=插座。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.errorerrno 111连接被拒绝。

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

方法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))

希望能解决问题。

燕璞
2023-03-14

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

    < li >检查您是否真的让该端口监听服务器(这将告诉您您的代码是否执行了您认为应该执行的操作):基于您的操作系统,但在linux上,您可以执行类似< code>netstat -ntulp的操作 < li >从服务器检查您是否接受到服务器的连接:同样基于您的操作系统,但是< code > telnet LISTENING _ IP LISTENING _ PORT 应该可以完成这项工作 < li >检查您是否可以从客户端访问服务器的端口,但不要使用代码:只需从客户端使用telnet(或适用于您的操作系统的命令)

然后让我们知道结果。

戚峻
2023-03-14

而不是

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

 类似资料:
  • 问题内容: 我是Socket的新手,请原谅我完全不了解。 我有一个服务器脚本(server.py): 和客户端脚本(client.py): 我转到台式机终端并通过键入以下命令启动脚本: 之后,我进入笔记本电脑终端并启动客户端脚本: 但出现以下错误: 在第9行的文件“ client.py”中 s.connect((主机,端口)) 文件“ /usr/lib/python2.7/socket.py”,第

  • 线程“main”org.springframework.web.client.resourceAccessException中的异常:“http://localhost:8081/footballershirt/footballershirts”的GET请求上的I/O错误:拒绝连接:连接;嵌套的异常是java.net.connectException:Connection:Connection a

  • 我正在尝试运行卡桑德拉,但每次它在连接时都会给出相同的错误...有什么我需要在配置文件或属性文件中编辑的吗? ('无法连接到任何服务器',{'127.0.0.1:9042 ':错误(61,"尝试连接到[('127.0.0.1 ',9042)]。最后一个错误:连接被拒绝")}) 启动cassandra时出错

  • 我试图通过Jedis客户端连接到redis服务器,但在连接时我得到了以下异常和堆栈跟踪- redisconnectionFailureException:无法获得Jedis连接;嵌套异常是redis.clients.jedis.exceptions.jedisconnectionException:无法从位于org.springframework.data.redis.connection.jed

  • 问题内容: 我正在尝试将Redis用作我的使用Docker Compose的Django项目的Celery的代理。我无法弄清楚我到底做错了什么,但是尽管控制台日志消息告诉我Redis正在运行并接受连接(实际上,当我这样做时,我可以看到容器正在运行),但我仍然会收到有关拒绝连接的错误消息。我什至做到了 看到回应是。 这是my中的Celery设置: 这是my中的Redis容器设置: 我还记得将容器与我

  • 有一个关于阿帕奇的 php 文件: 和节点js在同一个目录中 浏览器抛出错误:GEThttp://192.168.100.31/socket.io/?EIO=4 如果替换let套接字=io.connect('http://localhost:3000')在let套接字=io.connect('http://192.168.100.31:3000');浏览器将给出另一个错误:访问XMLHttp请求在