Python远程Socket连接超时求助:Replit客户端连本地服务器失败
远程Shell连接超时问题排查
问题现象
运行在Replit的客户端尝试连接本地服务器时出现超时错误,错误信息如下:
~/SEAshell$ python3 client.py Enter hostname: 192.168.10.16 [*] Set target to 192.168.10.16 ... [*] Connecting to server... Traceback (most recent call last): File "client.py", line 14, in <module> server.connect(ADDR) TimeoutError: [Errno 110] Connection timed out
客户端显示[*] Connecting to server...后等待许久才抛出超时异常,导致命令无法发送,代码未完成。
客户端代码
from socket import * from threading import Thread from os import system HOST = input('Enter hostname: ') print('[*] Set target to ' + HOST + " ...") PORT = 623 ADDR = (HOST, PORT) BUFF = 1024 * 128 SEP = "<sep>" server = socket(AF_INET, SOCK_STREAM) print('[*] Connecting to server...') server.connect(ADDR) print('[*] Server connected successfully!') def remote(): print('[>] Activation shell for ' + str(addr)) print('[>] Receiving path information...') info = server.recv(BUFF).decode() info = info.split(SEP) while True: command = input(info[2] + "@" + info[1] + ":" + info[0] + "$ ") print('Test: ' + command) remote()
服务端代码
from socket import * from threading import Thread import os HOST = gethostbyname(gethostname()) PORT = 623 ADDR = (HOST, PORT) BUFF = 1024 * 128 SEP = "<sep>" print('[*] Starting server at ' + str(ADDR)) server = socket(AF_INET, SOCK_STREAM) print('[*] Binding server...') try: server.bind(ADDR) except: ADDR = (HOST, 624) server.bind(ADDR) print('[*] Binded server at ' + str(ADDR)) print('[*] Server binded successfully!') print('[*] Listening for incoming connections') server.listen(5) def remote(conn, addr): cdir = os.getcwd() login = os.getlogin() hostname = gethostname() firstsend = send() while True: print('[*] Queued...') conn, addr = server.accept() print('[*] Connection received from ' + str(addr)) t = Thread(target=remote, args=(conn, addr)) t.start() print('[*] Listening for new connections...')
排查与解决要点
- 网络穿透问题:Replit客户端处于公网环境,直接使用局域网IP(如192.168.10.16)无法访问本地服务器。需要在路由器上配置端口转发,将公网IP的指定端口映射到本地服务器的IP和监听端口,客户端连接公网IP+转发端口。
- 服务端监听地址修正:服务端当前用
gethostbyname(gethostname())绑定局域网IP,仅能接收局域网内请求。应将HOST设为0.0.0.0,让服务端监听所有网卡的连接请求,确保端口转发过来的公网请求能被接收。 - 端口一致性检查:服务端代码中若623端口绑定失败会自动切换到624,但客户端固定使用623端口。需确保客户端使用的端口与服务端实际绑定的端口一致,可在服务端启动后确认监听端口,再修改客户端的
PORT值。 - 防火墙与安全组配置:本地服务器的防火墙需开放服务端监听的端口(623或624),允许外部入站连接;路由器的防火墙也需放行端口转发的规则。
- 服务端代码逻辑修复:服务端
remote函数中调用了未定义的send()函数,连接成功后会导致线程报错退出,后续需补充该函数实现(如通过conn.send()发送初始化信息)。
内容的提问来源于stack exchange,提问作者Vishu
相关产品推荐
相关产品推荐

