Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
GCE上的Python:连接失败,因为连接的主机未能响应_Python_Sockets_Networking_Google Compute Engine_Firewall - Fatal编程技术网

GCE上的Python:连接失败,因为连接的主机未能响应

GCE上的Python:连接失败,因为连接的主机未能响应,python,sockets,networking,google-compute-engine,firewall,Python,Sockets,Networking,Google Compute Engine,Firewall,我一直在从事一个项目,该项目需要在一台服务器(托管在GCE上)和多个客户端之间建立一点网络。我创建了一个计算引擎实例来运行Python脚本,如本视频所示: 以下是我的服务器端脚本: server = socket.gethostbyname(socket.gethostname()) # 10.128.X.XXX which is the Internal IP print(server) port = 5555 clients = 0 s = socket.socket(socket.AF_

我一直在从事一个项目,该项目需要在一台服务器(托管在GCE上)和多个客户端之间建立一点网络。我创建了一个计算引擎实例来运行Python脚本,如本视频所示:

以下是我的服务器端脚本:

server = socket.gethostbyname(socket.gethostname()) # 10.128.X.XXX which is the Internal IP
print(server)
port = 5555
clients = 0

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((server, port))

s.listen(2)
print("Waiting for connection...")

while True:
    conn, addr = s.accept()
    print("Connected to: ", addr)

    conn.send(str.encode(f"{clients}"))
    clients += 1
下面是我的客户端脚本:

class Network:
    def __init__(self):
        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server = "10.128.0.2"
        self.port = 5555
        self.addr = (self.server, self.port)
        self.id = int(self.connect())

    def connect(self):
        self.client.connect(self.addr)
        return self.client.recv(2048).decode()

network = Network()
print(f"Connected as client {network.id}")

我知道这个脚本可以工作,因为我已经用我的计算机作为服务器和一个客户端,另一台计算机作为第二个客户端进行了测试。但当我使用GCE作为服务器时,在客户端脚本中会出现以下错误:

TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
这可能是因为我使用的是内部IP地址而不是外部IP地址吗

在此之后,我尝试更改GCE的防火墙设置(添加了“python套接字”),它们看起来是这样的:

但是错误仍然存在

正如W_B所回答的,我尝试在我的虚拟机上运行这些命令,并得到以下输出:


根据您的描述,显然是连接问题

首先,您必须检查您创建的防火墙规则是否仍然存在。如果它“太宽”并且允许非常广泛的访问,那么它可能会在您不知道的情况下自动删除。它在你的屏幕截图上,但请再次检查以确定

如果存在,则通过GCP选择您将要使用的协议(我假设它是TCP)(您不能更改它),因此创建允许使用“任何协议”的规则是有风险的。另外-放置一个或两个目标IP(不是全部在VPC内)-这不是必须的,但可以提高网络的安全性

第二,确保您尝试连接的端口5555可以从其他计算机访问。您可以使用
nmap-p5554 put.server.ip.here来扫描目标主机

您可以从Internet或同一VPC网络中的其他VM进行扫描

你应该得到这样的东西:

root@localhost:~$ nmap -p 443 192.168.1.6
Starting Nmap 7.70 ( https://nmap.org ) at 2020-06-25 17:12 UTC
Nmap scan report for 192.168.1.6
Host is up (0.00091s latency).

PORT    STATE SERVICE
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
如果您看到
5555/tcp filtered freeciv
,这意味着有东西阻塞了端口

在服务器上运行nmap(我假设您运行的是Linux的某个版本),如果您不想安装任何非必要的软件,可以使用
sudo netstat-tulpn | grep LISTEN
获取打开端口的列表(列表中应该有5555个)


还要确保服务器上的防火墙不会阻止此端口。因此,我将python套接字规则仅限于TCP 5555和我的计算机的IP,并且它显然已启用。当我运行nmap命令时,它表示5555端口已关闭。然后,如果我运行netstat命令,它不会显示5555端口(只显示2、tcp 0和tcp6)。我还使用iptables命令允许5555打开,但错误并没有消失。目前,我只是将笔记本电脑用作服务器,这有点不方便。。。但是哦,好吧。无论如何谢谢你!你能把nmap&netstat命令的输出粘贴到这里吗?是的,我会在问题中包括屏幕截图。我还补充说,我正在使用虚拟机的内部IP地址连接套接字,因为一旦我尝试使用外部IP地址,就会出现以下错误:OSError:[Errno 99]无法分配请求的地址