Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 套接字错误:无法建立连接,因为目标计算机主动拒绝连接_Python_Python 3.x_Sockets_Python Sockets - Fatal编程技术网

Python 套接字错误:无法建立连接,因为目标计算机主动拒绝连接

Python 套接字错误:无法建立连接,因为目标计算机主动拒绝连接,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

注意:这个问题已经完全解决了,正如我在server.py之前运行client.py一样

刚开始使用socket编程,我已经创建了下面的代码,并希望打印一些字节消息,但它没有这样做

我只是想让任何人在任何时间都能看到这条信息 机器但是机器拒绝这样做

这是我的密码:

server.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"))
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。然后按照评论的建议在客户端脚本中使用它。第二个错误是,他同时启动了这两个脚本,服务器需要一段时间准备就绪,然后客户端才能尝试连接。答案中也解释了这一点。评论不用于进一步讨论;这段对话已经结束。