运行Python官方TCP客户端代码遇多类网络及事件循环错误求助
Asyncio TCP Echo客户端常见问题解决
1. ConnectionRefusedError: 远程计算机拒绝连接
问题原因:你连接的127.0.0.1:80没有运行对应的TCP echo服务,80端口默认是HTTP服务端口,不会处理echo请求。
解决方法:
- 启动本地TCP echo服务器,示例代码如下:
import asyncio async def handle_echo(reader, writer): data = await reader.read(100) message = data.decode() addr = writer.get_extra_info('peername') print(f"Received {message!r} from {addr!r}") print(f"Send: {message!r}") writer.write(data) await writer.drain() print("Close the connection") writer.close() await writer.wait_closed() async def main(): server = await asyncio.start_server( handle_echo, '127.0.0.1', 8888) addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets) print(f'Serving on {addrs}') async with server: await server.serve_forever() asyncio.run(main())
- 修改客户端的连接地址为
'127.0.0.1', 8888,确保服务器先启动,再运行客户端。 - 也可以连接公共TCP echo服务,比如
'echo.telnet.org', 7(部分公共服务可能存在不稳定情况)。
2. Spyder中RuntimeError: asyncio.run()不能从运行中的事件循环调用
问题原因:Spyder的IPython环境已启动asyncio事件循环,asyncio.run()会创建新事件循环,两者冲突导致报错。
解决方法:
- 替换
asyncio.run()为现有事件循环运行任务,修改客户端最后一行代码:
# 替换原有的asyncio.run() import asyncio loop = asyncio.get_event_loop() loop.run_until_complete(tcp_echo_client('Hello World!'))
- 或者进入Spyder设置:
IPython console > Advanced settings,关闭Support asyncio event loop integration选项,之后可正常使用asyncio.run()。
3. 连接8.8.8.8时OSError: 信号量超时
问题原因:8.8.8.8是谷歌DNS服务器,仅处理DNS查询(UDP/TCP 53端口),不会响应TCP echo请求,因此连接后无数据返回,最终超时。
解决方法:选择专门的echo服务地址和端口,比如本地服务器或公共echo服务的7端口(echo服务默认端口为7)。
内容的提问来源于stack exchange,提问作者Hex
相关产品推荐
相关产品推荐

