我有一个具有多个客户端的服务器。服务器为每个客户端都有一个单独的线程。这是我在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 = 64
和FORMAT = "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
为什么会这样
目前没有回答
相关问题 更多 >
编程相关推荐