Python 套接字错误:无法建立连接,因为目标计算机主动拒绝连接
注意:这个问题已经完全解决了,正如我在server.py之前运行client.py一样 刚开始使用socket编程,我已经创建了下面的代码,并希望打印一些字节消息,但它没有这样做 我只是想让任何人在任何时间都能看到这条信息 机器但是机器拒绝这样做 这是我的密码: server.pyPython 套接字错误:无法建立连接,因为目标计算机主动拒绝连接,python,python-3.x,sockets,python-sockets,Python,Python 3.x,Sockets,Python Sockets,注意:这个问题已经完全解决了,正如我在server.py之前运行client.py一样 刚开始使用socket编程,我已经创建了下面的代码,并希望打印一些字节消息,但它没有这样做 我只是想让任何人在任何时间都能看到这条信息 机器但是机器拒绝这样做 这是我的密码: server.py import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) port = 12048 s.bind((socket.gethostnam
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 12048
s.bind((socket.gethostname(), port))
s.listen()
while True:
c, addr = s.accept()
print("Got connection from", addr)
c.send(bytes("Thank you", "utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 12048
s.connect(('192.168.0.1', port))
msg = s.recv(1024)
print(msg.decode("utf-8"))
client.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 12048
s.bind((socket.gethostname(), port))
s.listen()
while True:
c, addr = s.accept()
print("Got connection from", addr)
c.send(bytes("Thank you", "utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 12048
s.connect(('192.168.0.1', port))
msg = s.recv(1024)
print(msg.decode("utf-8"))
一些图片可以更好地解释我的错误:
任何帮助都将不胜感激它看起来像是在
server.py
脚本中使用的s.bind((socket.gethostname(),port))
其中socket.gethostname()
是主机名,但在client.py
脚本中使用的是s.connect('192.168.0.1',port))
其中'192.168.0.1'
是您尝试连接的主机名
我想你已经有了socket.gethostname()
!=<代码>'192.168.0.1'这就是问题所在
此外,您还可以使用此解决方案绑定到主机上的所有可用IP地址
让我们使用listen\u ip=socket.gethostbyname(socket.gethostname())
进行连接,因为socket.gethostname()
可能返回主机名而不是ip,并且如果它是本地名称,而不是dns,则不会由本地网络中的python dns解析程序进行解析
然后将其用作s.bind((侦听ip,端口))
和s.connect((侦听ip,端口))
经过一些调试后,我为您找到了一个有效的解决方案
这里有所需的脚本
server.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.gethostname())
port = 12_048
s.bind((host, port))
s.listen()
print("Server listening @ {}:{}".format(host, port))
while True:
c, addr = s.accept()
print("Got connection from", addr)
c.send(bytes("Thank you", "utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.1.162' # The IP printed by the server must be set here
# or we can set it using env variable named SERVER_IP
if 'SERVER_IP' in os.environ:
host = os.environ['SERVER_IP']
port = 12048
print("Connecting to {}:{}".format(host, port))
s.connect((host, port))
msg = s.recv(1024)
print(msg.decode("utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.gethostname())
port = 12048
s.bind((host, port))
s.listen()
print("Server listening @ {}:{}".format(host, port))
while True:
c, addr = s.accept()
print("Got connection from", addr)
c.send(bytes("Thank you", "utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.1.162' # The IP printed by the server must be set here
port = 12048
print("Connecting to {}:{}".format(host, port))
s.connect((host, port))
msg = s.recv(1024)
print(msg.decode("utf-8"))
client.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.gethostname())
port = 12_048
s.bind((host, port))
s.listen()
print("Server listening @ {}:{}".format(host, port))
while True:
c, addr = s.accept()
print("Got connection from", addr)
c.send(bytes("Thank you", "utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.1.162' # The IP printed by the server must be set here
# or we can set it using env variable named SERVER_IP
if 'SERVER_IP' in os.environ:
host = os.environ['SERVER_IP']
port = 12048
print("Connecting to {}:{}".format(host, port))
s.connect((host, port))
msg = s.recv(1024)
print(msg.decode("utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.gethostname())
port = 12048
s.bind((host, port))
s.listen()
print("Server listening @ {}:{}".format(host, port))
while True:
c, addr = s.accept()
print("Got connection from", addr)
c.send(bytes("Thank you", "utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.1.162' # The IP printed by the server must be set here
port = 12048
print("Connecting to {}:{}".format(host, port))
s.connect((host, port))
msg = s.recv(1024)
print(msg.decode("utf-8"))
在一次聊天对话中,我们得出结论,问题中的硬编码IP不是正确的IP。此解决方案确实具有他所需的IP,但在每种情况下都会有所不同。请记住,需要首先启动
server.py
,当您看到打印的服务器正在侦听@IP:12048
,请将该IP写入client.py
并启动它。即使您已经知道IP,客户机也需要在看到该行后启动,因为服务器需要一些时间准备就绪,如果在服务器未准备就绪时尝试连接到服务器,客户机将崩溃
server.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.gethostname())
port = 12_048
s.bind((host, port))
s.listen()
print("Server listening @ {}:{}".format(host, port))
while True:
c, addr = s.accept()
print("Got connection from", addr)
c.send(bytes("Thank you", "utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.1.162' # The IP printed by the server must be set here
# or we can set it using env variable named SERVER_IP
if 'SERVER_IP' in os.environ:
host = os.environ['SERVER_IP']
port = 12048
print("Connecting to {}:{}".format(host, port))
s.connect((host, port))
msg = s.recv(1024)
print(msg.decode("utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.gethostname())
port = 12048
s.bind((host, port))
s.listen()
print("Server listening @ {}:{}".format(host, port))
while True:
c, addr = s.accept()
print("Got connection from", addr)
c.send(bytes("Thank you", "utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.1.162' # The IP printed by the server must be set here
port = 12048
print("Connecting to {}:{}".format(host, port))
s.connect((host, port))
msg = s.recv(1024)
print(msg.decode("utf-8"))
client.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.gethostname())
port = 12_048
s.bind((host, port))
s.listen()
print("Server listening @ {}:{}".format(host, port))
while True:
c, addr = s.accept()
print("Got connection from", addr)
c.send(bytes("Thank you", "utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.1.162' # The IP printed by the server must be set here
# or we can set it using env variable named SERVER_IP
if 'SERVER_IP' in os.environ:
host = os.environ['SERVER_IP']
port = 12048
print("Connecting to {}:{}".format(host, port))
s.connect((host, port))
msg = s.recv(1024)
print(msg.decode("utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.gethostname())
port = 12048
s.bind((host, port))
s.listen()
print("Server listening @ {}:{}".format(host, port))
while True:
c, addr = s.accept()
print("Got connection from", addr)
c.send(bytes("Thank you", "utf-8"))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.1.162' # The IP printed by the server must be set here
port = 12048
print("Connecting to {}:{}".format(host, port))
s.connect((host, port))
msg = s.recv(1024)
print(msg.decode("utf-8"))
您确定
socket.gethostname()
返回IP地址192.168.0.1
的主机名吗?你确定地址是192.168.0.1吗?这是网关的通用地址,但主机的地址不通用。那么我该怎么办呢?如果我输入另一个主机名/ip地址,它会说防火墙已经阻止了它。你在哪里运行服务器?你在哪里运行客户端?它们是否在同一系统(机器、主机)上?然后对bind
和connect
调用使用127.0.0.1
。否则,您需要找出服务器主机的实际公共地址,并将其用于connect
调用。我还建议您在绑定
调用中使用通配符地址'
,以便服务器将侦听所有可用接口上的连接。除非您有充分的理由不这样做,否则请使用0.0.0.0。此代码完全正确。但不是在我的机器上工作。现在我相信这是机器的故障,而不是代码,从一开始。你能给我建议如何解决这个问题吗。什么改变了?光靠代码是不够的。您必须解释。@user207421在聊天对话中调试了两个错误,这些错误出现在这个脚本中。以上对这两个问题进行了解释。第一个是,他在客户机中有一个硬编码的IP,与服务器IP不匹配。通过如上所述打印服务器监听@IP:12048
消息,您可以获得服务器IP。然后按照评论的建议在客户端脚本中使用它。第二个错误是,他同时启动了这两个脚本,服务器需要一段时间准备就绪,然后客户端才能尝试连接。答案中也解释了这一点。评论不用于进一步讨论;这段对话已经结束。