首页 > 解决方案 > server.py 和 client.py 在两个单独的“Windows”ec2 实例上连接时出现超时错误?

问题描述

我有一个基本的服务器和客户端,我需要能够进行通信。他们在本地工作没有问题,但是一旦我将它们上传到他们的 ec2 实例上,我就会在客户端收到超时错误。

(每个实例都在自己的 aws 帐户上……服务器在一个帐户上,客户端在另一个帐户上)

“TimeoutError: [WinError 10060] 连接尝试失败,因为连接方在一段时间后没有正确响应,或建立连接失败,因为连接的主机没有响应”

我相信这是端口和/或权限的问题,但我不确定如何解决它,因为我读到的所有内容都是关于远程连接的......这很好。

目前我已经允许来自任何 ip 的所有 tcp 连接进行测试,但会在它工作时更改安全组。

服务器.py

import socket

HEADER_LEN = 10
HOST = socket.gethostname()
PORT = 9999


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen()

while True:

    connection, address = s.accept()
    print(f"Connection from {address} has been established.")

    msg = "Welcome to the server!"
    msg = f"{len(msg):<{HEADER_LEN}}" + msg

    connection.send(bytes(msg,"utf-8"))

    while True:


        msg = input()
        msg = f"{len(msg):<{HEADERSIZE}}" + msg

        connection.send(bytes(msg,"utf-8"))

客户端.py

import socket

HEADER_LEN = 10
HOST = "6.134.121.189"
PORT = 9999

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

while True:
    full_message = ''
    new_message = True
    while True:
        message = s.recv(16)
        if new_message:
             message_len = int(message[:HEADER_LEN])
             new_message = False

        full_message += message.decode("utf-8")

        if (len(full_message) - HEADER_LEN > 0) and (len(full_message)- 
                                                HEADER_LEN == message_len):
    
            print(full_message[HEADER_LEN:])
            
            new_message = True
            full_message = ''

标签: python-3.xamazon-web-servicessocketsamazon-ec2python-sockets

解决方案


这些类型的问题通常是某种网络路由问题。

在您的 SG 中启用 ICMP 并查看是否可以 ping 您的计算机,如果不能,则这绝对是网络路由问题,您可以检查以下一些:

  1. 验证计算机是否在公共子网上。AWS 允许您为实例提供公共 IP,即使它位于私有子网上。这很令人困惑,并且位于私有子网上会阻止任何东西从互联网路由到它(即使它具有公共/弹性 IP)。
  2. 验证您的实例上是否禁用了 Windows 防火墙。最好只禁用操作系统级别的防火墙,这样您就可以通过 AWS 中的 SG 和 NACL 控制规则。

推荐阅读