python - 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()
解决方案
我看到了你的代码,我想我已经解决了你可能遇到的问题我以某种方式更改了一些代码它同时接收多个客户端 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 等做什么。但我认为你可以做到这一点。如果您仍有任何问题,请随时与我们联系。
推荐阅读
- python - 如何根据文件名组合/附加PDF?
- php - 即使为空,数组也充满了空白值
- mysql - eZ平台本地安装无法连接MySQL数据库
- amazon-s3 - Cloud Storage 客户访问最佳做法
- amazon-web-services - AWS 节点的 Docker 上是否有时间同步过程?
- python - pdoc 生成的 HTML 中的方法参数格式不正确
- go - 如何在 EC2 实例的 2 个端口上运行简单的 Go 服务器?
- ios - 多个命令在存档上产生 gRPCCertificates.bundle 错误(iOS Xcode 11.1,Firebase SDK)
- c# - 无法访问 C# 中 Activator 返回的对象方法
- swift - 如何在 Swift 中转换 @Binding