server.py 和 client.py 连接两个单独的 "Windows" ec2 实例时出现超时错误?
Timeout Error when server.py and client.py connect on two separate "Windows" ec2 instances?
我有一个基本的服务器和客户端,我需要能够进行通信。他们在本地工作没有问题,但是一旦我将它们上传到他们的 ec2 实例上,我就会在客户端收到超时错误。
(每个实例都在自己的 aws 帐户上...服务器在一个帐户上,客户端在另一个帐户上)
"TimeoutError: [WinError 10060] 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应"
我认为这是端口 and/or 权限的问题,但我不确定如何解决它,因为我读到的所有内容都是关于远程连接的……没关系。
目前我已经允许来自任何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 通您的机器,如果不能则这肯定是网络路由问题,您可以检查以下一些内容:
- 验证机器在 public 子网上。 AWS 允许您为实例提供 public IP,即使它位于私有子网上。这是令人困惑的,并且在私有子网上将阻止任何东西从互联网路由到它(即使它有一个 public/elastic IP)。
- 确认 Windows 防火墙在您的实例上被禁用。最佳做法是仅禁用 OS-level 防火墙,以便您可以通过 AWS 中的 SG 和 NACL 控制规则。
我有一个基本的服务器和客户端,我需要能够进行通信。他们在本地工作没有问题,但是一旦我将它们上传到他们的 ec2 实例上,我就会在客户端收到超时错误。
(每个实例都在自己的 aws 帐户上...服务器在一个帐户上,客户端在另一个帐户上)
"TimeoutError: [WinError 10060] 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应"
我认为这是端口 and/or 权限的问题,但我不确定如何解决它,因为我读到的所有内容都是关于远程连接的……没关系。
目前我已经允许来自任何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 通您的机器,如果不能则这肯定是网络路由问题,您可以检查以下一些内容:
- 验证机器在 public 子网上。 AWS 允许您为实例提供 public IP,即使它位于私有子网上。这是令人困惑的,并且在私有子网上将阻止任何东西从互联网路由到它(即使它有一个 public/elastic IP)。
- 确认 Windows 防火墙在您的实例上被禁用。最佳做法是仅禁用 OS-level 防火墙,以便您可以通过 AWS 中的 SG 和 NACL 控制规则。