连接 AWS EC2 实例使用 Python Socket

5

Server.py(运行在我aws ec2实例上)

import socket

s = socket.socket()
host = socket.gethostbyaddr('aws.ec2.public.ip')[0]
port = 12345
s.bind((host, port))

s.listen(5)
while True:
   c, addr = s.accept()
   print('Got connection from', addr)
   c.send('Thank you for connecting'.encode())
   c.close()

客户端.py(在我的本地电脑上运行)

import socket

s = socket.socket()
host = socket.gethostbyaddr('aws.ec2.public.ip')[0]
port = 12345

s.connect((host, port))
print(s.recv(1024).decode())
s.close()

所有入站和出站的TCP流量均被授权

服务器代码没有显示错误。 但是客户端代码显示:

Traceback (most recent call last):
  File "/Users/sohamjain/Desktop/client.py", line 7, in <module>
    s.connect((host, port))
TimeoutError: [Errno 60] Operation timed out
>>> 

通过rdp客户端连接EC2实例完美运行

当我在本地主机上运行这两个脚本时,它们似乎都正常工作。 但是,在AWS EC2实例的情况下,它并没有正常工作。 我哪里错了?


你看到了什么类型的错误?例如,您能否使用SSH从客户端连接到“服务器”服务器(您说您已经打开了所有端口)? - Chris Williams
同时,需要确认server.py实例不会意识到它具有公共地址。它只会理解它具有私有IP地址,因为Internet网关在接收流量时执行NAT转换入站以将公共IP映射到私有IP。可以通过运行ifconfig来确认这一点。 - Chris Williams
1个回答

3
我刚遇到了你的情况:
就像Chris Williams在回答你的问题时提到的那样,当绑定EC2实例上的监听套接字时,您不能使用公共IP地址。将其更改为使用私有IP地址,应该就可以解决问题。
此外,请确保在AWS安全组中启用所绑定端口的流量。

但是如果你将它更改为私有IP,你实际上无法从外部访问它...那么有什么意义呢?它需要在实际的外部IP上进行监听。 - Eight Rice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接