本地Python TCP客户端与服务器连接测试问题及解决示例
Python TCP收发示例运行无接收提示问题解决
运行环境
- 开发IDE:PyCharm
- Python版本:3.6
- 已配置收发两端脚本并行运行权限
初始版本代码
服务端代码
import socket import sys # Create a TCP/IP socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Bind the socket to the port server_address = ('localhost', 5005) print(sys.stderr, 'starting up on %s port %s' % server_address) sock.bind(server_address) # Listen for incoming connections sock.listen(1) while True: # Wait for a connection print(sys.stderr, 'waiting for a connection') connection, client_address = sock.accept() try: print(sys.stderr, 'connection from', client_address) # Receive the data in small chunks and retransmit it while True: data = connection.recv(16) print(sys.stderr, 'received "%s"' % data) if data: print(sys.stderr, 'sending data back to the client') connection.sendall(data) else: print(sys.stderr, 'no more data from', client_address) break finally: # Clean up the connection connection.close()
客户端代码
import socket TCP_IP = 'localhost' TCP_PORT = 5005 BUFFER_SIZE = 1024 MESSAGE = "Hello, World!" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((TCP_IP, TCP_PORT)) s.send(MESSAGE.encode('utf-8'))
问题表现
两端脚本运行无任何报错,客户端调试逐行运行均正常执行,但服务端无任何数据接收相关提示。
问题原因
- 服务端打印逻辑错误:代码中
print(sys.stderr, '日志内容')的写法是将sys.stderr对象作为普通内容输出到标准输出流,并未实现日志输出到标准错误流的预期,正确写法为print('日志内容', file=sys.stderr)。若PyCharm控制台做了日志流过滤,就会看不到相关输出,误以为服务端未收到数据。 - 客户端逻辑缺失:发送数据后无任何等待逻辑直接结束进程,可能触发TCP连接快速重置,导致服务端来不及读取内核缓冲区的接收数据就断开连接。
修复后可运行代码
服务端代码
#!/usr/bin/env python3 import socket HOST = '127.0.0.1' # 标准回环接口地址(localhost) PORT = 65432 # 监听端口(非特权端口为大于1023的端口) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen() conn, addr = s.accept() with conn: print('Connected by', addr) while True: data = conn.recv(1024) if not data: break conn.sendall(data + b' from server')
客户端代码
#!/usr/bin/env python3 import socket HOST = '127.0.0.1' # 服务端主机名或IP地址 PORT = 65432 # 服务端监听的端口 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b'Hello, world') data = s.recv(1024) print('Received', repr(data))
运行结果
Received b'Hello, world from server'
内容的提问来源于stack exchange,提问作者Marco Bob
相关产品推荐
相关产品推荐

