【问题标题】:Connecting AWS EC2 instance using Python Socket使用 Python Socket 连接 AWS EC2 实例
【发布时间】:2020-06-17 18:45:47
【问题描述】:

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()

Client.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 从客户端服务器连接到“服务器”服务器(您说您已打开所有端口)。
  • 还要确认server.py 的实例不会知道它有那个公共地址。它只会知道它拥有私有 IP 地址,因为互联网网关在接收流量时执行入站 NAT 转换以将公共 IP 映射到私有 IP。这可以通过运行ifconfig 来确认

标签: python amazon-web-services sockets amazon-ec2 tcp


【解决方案1】:

我刚遇到你的情况:

正如 Chris Williams 在回复您的问题时提到的那样,在 EC2 实例上绑定侦听套接字时,您不能使用公共 IP 地址。将其更改为使用私有 IP,它应该可以工作。

还要确保为要绑定的端口启用来自 AWS 安全组的流量。

【讨论】:

  • 但是如果你把它改成私有IP,你就无法真正从外部访问它..那有什么意义呢?它需要监听实际的外部 IP
猜你喜欢
  • 2012-11-23
  • 2020-08-07
  • 2018-11-28
  • 2022-11-24
  • 2014-03-03
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多