如何实现本地Python Socket客户端与AWS EC2 Ubuntu服务端的通信?
本地Socket客户端连接AWS EC2服务端完整解决方案
一、EC2服务端Socket监听配置
服务端绑定地址规则
服务端代码必须绑定0.0.0.0,而非私网IP或公网IP。0.0.0.0表示监听实例所有可用网络接口,能同时接收私网和公网转发的请求。绑定公网IP会启动失败,因为EC2的公网IP是AWS通过NAT映射的,实例本身并未直接绑定该IP。
示例Python服务端代码:import socket HOST = '0.0.0.0' # 核心:绑定所有网络接口 PORT = 12345 # 自定义端口,确保未被系统占用 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen() conn, addr = s.accept() with conn: print(f"Connected by {addr}") while True: data = conn.recv(1024) if not data: break conn.sendall(data)EC2本地防火墙配置
Ubuntu默认使用ufw防火墙,需开放对应端口的入站流量:# 允许指定端口的TCP流量 sudo ufw allow 12345/tcp # 重启防火墙使规则生效 sudo ufw reload执行
sudo ufw status可查看当前防火墙规则是否生效。
二、客户端与服务端地址对应
- 服务端:绑定
0.0.0.0,端口与代码中指定的一致(如12345) - 客户端:连接地址填写EC2的公网IP(或公网域名),端口与服务端保持一致。
公网IP可在EC2控制台实例详情页查看,也可在实例内执行curl ifconfig.me获取。
三、实现服务端24/7运行
方法1:nohup后台运行(快速简单)
# 后台运行服务端脚本,输出日志到nohup.out文件 nohup python3 your_server_script.py &
关闭SSH连接后进程仍会持续运行,日志可通过cat nohup.out查看。
方法2:systemd服务配置(稳定可靠)
- 创建服务配置文件:
写入以下内容(替换脚本路径和名称):sudo nano /etc/systemd/system/socket-server.service[Unit] Description=Socket Server Service After=network.target [Service] User=ubuntu WorkingDirectory=/home/ubuntu/your_script_directory ExecStart=/usr/bin/python3 /home/ubuntu/your_script_directory/your_server_script.py Restart=always # 进程意外退出时自动重启 [Install] WantedBy=multi-user.target - 启动并设置开机自启:
查看服务状态:sudo systemctl daemon-reload sudo systemctl start socket-server sudo systemctl enable socket-serversudo systemctl status socket-server
四、EC2安全组规则检查
- 登录AWS EC2控制台,找到目标实例,点击"安全组"链接进入配置页面。
- 添加入站规则:
- 类型:自定义TCP
- 端口范围:填写服务端使用的端口(如12345)
- 源:测试阶段可选择
0.0.0.0/0(允许所有IP访问),生产环境建议限制为本地PC的公网IP。
- 出站规则保持默认(允许所有出站流量)即可。
额外排查步骤
若仍出现超时错误,按以下顺序排查:
- 在EC2实例执行
netstat -tulpn | grep 12345(替换为你的端口),确认服务端是否在监听0.0.0.0:12345。 - 在本地PC执行
telnet ec2-public-ip 12345测试端口连通性,若不通则说明安全组或本地防火墙存在拦截。 - 检查本地PC防火墙是否允许出站到该端口。
内容的提问来源于stack exchange,提问作者Citoyen x14
相关产品推荐
相关产品推荐

