Python Socket发送系统信息报错TypeError,求解决方法
问题原因分析
你遇到的TypeError源于两个核心问题:
informacion()函数没有返回值,默认返回None,而Socket的send()方法要求传入字节类型的数据,无法识别None。- 原函数仅将硬件信息打印在服务器控制台,没有把信息整理成可通过网络传输的格式。
解决步骤
1. 修改informacion()函数,返回结构化信息字符串
把原本打印的内容拼接成一个完整字符串,每行用换行符\n分隔,最终返回该字符串:
def informacion(): info_lines = [] info_lines.append("="*40 + " System Information " + "="*40) info_lines.append(f"System: {uname.system}") info_lines.append(f"Node Name: {uname.node}") info_lines.append(f"Release: {uname.release}") info_lines.append(f"Version: {uname.version}") info_lines.append(f"Machine: {uname.machine}") info_lines.append(f"Processor: {uname.processor}") # 将所有行拼接为单个字符串,每行自动换行 return "\n".join(info_lines)
2. 调整Socket发送逻辑
调用informacion()获取字符串后,用encode()转换成字节类型再发送,同时调整条件分支避免重复发送冗余内容:
while True: # 建立连接 socketConexion, addr = socketServidor.accept() print("Conectado con cliente",addr) while True: # 接收客户端消息 mensajeRecibido = socketConexion.recv(4096).decode() print(mensajeRecibido) if mensajeRecibido == 'exit': break if mensajeRecibido == 'informacion': # 获取系统信息并编码为字节发送 sys_info = informacion() socketConexion.send(sys_info.encode()) else: # 其他情况发送输入内容 socketConexion.send(input().encode()) print("Desconectado del cliente",addr) # 关闭连接 socketConexion.close()
完整修改后的代码
# 导入库 import psutil import platform from datetime import datetime from socket import * uname = platform.uname() direccionServidor = "localhost" puertoServidor = 9099 # 创建新Socket socketServidor = socket (AF_INET, SOCK_STREAM) # 绑定地址与端口 socketServidor.bind((direccionServidor, puertoServidor)) socketServidor.listen() def informacion(): info_lines = [] info_lines.append("="*40 + " System Information " + "="*40) info_lines.append(f"System: {uname.system}") info_lines.append(f"Node Name: {uname.node}") info_lines.append(f"Release: {uname.release}") info_lines.append(f"Version: {uname.version}") info_lines.append(f"Machine: {uname.machine}") info_lines.append(f"Processor: {uname.processor}") return "\n".join(info_lines) while True: # 建立连接 socketConexion, addr = socketServidor.accept() print("Conectado con cliente",addr) while True: # 接收客户端消息 mensajeRecibido = socketConexion.recv(4096).decode() print(mensajeRecibido) if mensajeRecibido == 'exit': break if mensajeRecibido == 'informacion': sys_info = informacion() socketConexion.send(sys_info.encode()) else: socketConexion.send(input().encode()) print("Desconectado del cliente",addr) # 关闭连接 socketConexion.close()
额外说明
- 客户端收到信息后,需要调用
decode()将字节转回字符串才能正常显示。 - 如果需要添加更多硬件信息(如CPU使用率、内存占用),可在
informacion()函数中通过psutil库获取后追加到info_lines列表。
内容的提问来源于stack exchange,提问作者facu_0810
相关产品推荐
相关产品推荐

