BlockingIOError:[Errno 35]资源暂时不可用[sockets][多线程]

2024-06-25 22:39:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个具有多个客户端的服务器。服务器为每个客户端都有一个单独的线程。这是我在server.py中的线程客户端函数 前面,我打开服务器并运行s.accept()来接受客户机,但由于我不希望它阻止我的程序,所以我设置了s.setblocking(0)

def threaded_client(conn, addr, clientID):
    clientUsernameLength = int(conn.recv(HEADER).decode(FORMAT))
    clientUsername = pickle.loads(conn.recv(clientUsernameLength))

    print(f"{clientUsername} joined!")

    #add this player to the players dictionary
    **clientDataLength = int(conn.recv(HEADER).decode(FORMAT))**
    clientDataDict = pickle.loads(conn.recv(clientDataLength))
    players[clientUsername] = clientDataDict

    send(conn, f"Thanks for joining us, {clientUsername}!")

    connected = True
    while connected: #continually run while the client is still connected
        try: #check if server has received a message from a player
            clientMessageLength = conn.recv(HEADER).decode(FORMAT)

            if clientMessageLength:
                clientMessageLength = int(clientMessageLength)
                clientMessage = pickle.loads(conn.recv(clientMessageLength))
                print(f"[Client {clientID}][{clientMessage}]")

                if clientMessage == DISCONNECT_MESSAGE:
                    print(f"Client {clientID} disconnected")
                    send(conn, "Thanks for joining us!")
                    connected = False
                else:
                    send(conn, "Message received!")
        except socket.error: #no message received
            pass
    conn.close()

Mysend()函数只使用带有HEADER = 64FORMAT = "utf-8"的缓冲区

def send(conn, message):
    reply = pickle.dumps(message)
    replyLength = len(reply)
    sendHeader = bytes(str(replyLength), FORMAT)
    sendHeader += b" " * (HEADER - len(sendHeader))
    conn.send(sendHeader) #first send the length of the mesage
    #now send the message
    conn.send(reply)

在客户端,我首先发送用户名,然后发送字典

dataDict = {"score": score, "health": 10, "items": ["shield", "mirror"]}
while True:
    try:
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect(ADDR)
        send(username)
        send(dataDict)
        break
    except ConnectionRefusedError:
        print("Waiting for server...")

但是,clientDataLength=int(conn.recv(HEADER).decode(FORMAT))遇到错误:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "<server file>, line 127, in threaded_client
    clientDataLength = conn.recv(HEADER).decode(FORMAT)
BlockingIOError: [Errno 35] Resource temporarily unavailable

为什么会这样


Tags: theclientsendformat客户端messageserversocket