Python Socket聊天室出现WinError 10038与TypeError错误求助
问题排查与修复方案
错误1:服务端TypeError: a bytes-like object is required, not 'str'
原因
Python3中socket的send()、recv()方法仅操作字节(bytes)类型,当前代码直接传入字符串类型,触发类型不匹配错误。
修复点(chat_server.py)
- 所有调用
send()的位置,将字符串编码为utf-8格式的字节 - 所有
recv()拿到的字节内容,先解码为字符串再做字符串拼接操作
修改后的核心代码片段:
def clientthread(conn, addr): # 发送前编码为字节 conn.send("Welcome to this chatroom!".encode('utf-8')) while True: try: # 接收后解码为字符串 message = conn.recv(2048).decode('utf-8') if message: print("<" + addr[0] + "> " + message) message_to_send = "<" + addr[0] + "> " + message broadcast(message_to_send,conn) else: remove(conn) except: continue def broadcast(message,connection): for clients in list_of_clients: if clients!=connection: try: # 发送前编码为字节 clients.send(message.encode('utf-8')) except: clients.close() remove(clients)
错误2:客户端OSError: [WinError 10038] an operation was attempted on something that is not a socket
原因
Windows系统下的select.select仅支持监听socket对象,当前代码把sys.stdin(标准输入的文件描述符,不属于socket类型)放到了监听列表中,系统无法识别。
修复方案(client.py)
单独开一个线程处理用户的标准输入,主线程仅监听socket的接收事件,不要把sys.stdin放到select的监听列表里,修改后的完整代码如下:
import socket import sys from _thread import * server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if len(sys.argv) != 3: print ("Correct usage: script, IP address, port number") exit() IP_address = str(sys.argv[1]) Port = int(sys.argv[2]) server.connect((IP_address, Port)) # 子线程负责处理用户输入、发送消息 def input_thread(server): while True: message = sys.stdin.readline() server.send(message.encode('utf-8')) sys.stdout.write("<You>") sys.stdout.write(message) sys.stdout.flush() start_new_thread(input_thread,(server,)) # 主线程仅负责监听服务端推送的消息 while True: try: message = server.recv(2048).decode('utf-8') if message: print(message) else: break except: break server.close()
内容的提问来源于stack exchange,提问作者FrEzylz
相关产品推荐
相关产品推荐

