You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Socket聊天室出现WinError 10038与TypeError错误求助

问题排查与修复方案

错误1:服务端TypeError: a bytes-like object is required, not 'str'

原因

Python3中socket的send()、recv()方法仅操作字节(bytes)类型,当前代码直接传入字符串类型,触发类型不匹配错误。

修复点(chat_server.py)

  1. 所有调用send()的位置,将字符串编码为utf-8格式的字节
  2. 所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:45:03