首页 > 解决方案 > BlockingIOError:[Errno 11]资源暂时不可用两个客户端一个服务器套接字python

问题描述

我试图简单地将消息从两个客户端套接字发送到一个服务器套接字。当我启动服务器套接字时,它工作正常,然后当我启动两个客户端套接字中的每一个(我正在使用 3 个不同的终端窗口)时,一切正常。如果我启动服务器和一个客户端,我可以将消息从客户端发送到服务器。如果我随后启动第二个客户端,我可以从第二个客户端向服务器发送消息,但是现在如果我返回并尝试从第一个客户端向服务器发送消息,我会收到“BlockingIOError: [Errno 11]资源暂时不可用”。问题是什么?

客户端类.py:

from itertools import count
import select
import random
import threading
import time

class Client(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.host = "127.0.0.1"
        self.port = 65432


    def run(self):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.id = random.randrange(0, 1000)
        print(f"client id {self.id} connected")
        self.sock.connect((self.host, self.port))
        while True:
            text = input('m: ')
            self.sock.sendall(text.encode())

服务器.py:

import socket
from itertools import count
import select
from _thread import start_new_thread
import threading
import time
from queue import Queue

class server(threading.Thread):
    def __init__(self):
        self.host = "127.0.0.1"
        self.port = 65432
        threading.Thread.__init__(self)

    def run(self):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sock.bind((self.host, self.port))
        self.sock.listen(5)
        self.sock.setblocking(0)


        print(f"server instantiated")
        inputs = [self.sock]
        outputs = []
        message_queues = {}

        while inputs:
            inputready,outputready,exceptready = select.select(inputs,outputs,inputs)
            for input_item in inputready:
                if input_item is self.sock:
                    conn, addr = self.sock.accept()
                    print("New connection from: ", addr)
                    conn.setblocking(0)
                    inputs.append(conn)
                else:
                    data = conn.recv(1024)
                    if data:
                        print("Client:  " + data.decode())
                        #message_queues[input_item].put(data)
                        if input_item not in outputs:
                            outputs.append(input_item)
                    else:
                        if input_item in outputs:
                            outputs.remove(input_item)
                        inputs.remove(input_item)
                        input_item.close()



class Message_Sender(threading.Thread):
    def __init__(self, client):
        threading.Thread.__init__(self)
        self.client = client

    def run(self):
        while True:
            text = input('m: ')
            server.conn.sendall(text.encode())

server = server()
server.start()
msg = Message_Sender(server)
msg.start()

客户端实例:

import clientclass

client = clientclass.Client()
client.start()

标签: pythonmultithreadingsockets

解决方案


我看到了你的代码,我想我已经解决了你可能遇到的问题我以某种方式更改了一些代码它同时接收多个客户端 server.py:

import socket
from itertools import count
import select
from _thread import start_new_thread
import threading
import time
from queue import Queue

class server(threading.Thread):
    def __init__(self):
        self.host = "127.0.0.1"
        self.port = 65432
        threading.Thread.__init__(self)

    def run(self):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sock.bind((self.host, self.port))



        print(f"server instantiated")
        inputs = [self.sock]
        outputs = []
        message_queues = {}

        while True:
            self.sock.listen(5)
            conn, addr = self.sock.accept()
            receive = threading.Thread(target=self.receive_data, args=(conn,))
            receive.start()
            inputs.append(conn)

    def receive_data(self, conn):
        while True:
            data = conn.recv(1024)
            if data:
                print("Client:  " + data.decode())
                # do something



class Message_Sender(threading.Thread):
    def __init__(self, client):
        threading.Thread.__init__(self)
        self.client = client

    def run(self):
        while True:
            text = input('m: ')
            server.conn.sendall(text.encode())

server = server()
server.start()
msg = Message_Sender(server)
msg.start()

我在 run 函数中创建了一个循环,当有人尝试连接它时,它将创建一个新线程来接收他们的消息。我不清楚你想对变量输入和 input_item 等做什么。但我认为你可以做到这一点。如果您仍有任何问题,请随时与我们联系。


推荐阅读