当server.py和client.py在两个单独的“ Windows” ec2实例上连接时发生超时错误?

问题描述

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

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

“ TimeoutError:[WinError 10060]连接尝试失败,因为一段时间后连接方未正确响应,或者由于连接的主机未能响应而建立的连接失败”

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

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

server.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"))

client.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 = ''

解决方法

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

在SG中启用ICMP并查看是否可以ping通计算机,如果不能,则肯定是网络路由问题,您可以检查以下一些内容:

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...