В настоящее время я делаю простой сервер с использованием Python 3.x.Я использую пул потоков, поскольку в любой момент времени может быть подключено большое количество клиентов.Клиент отправляет объект json на сервер, где он затем анализируется и обрабатывается.Однако, когда я отправляю несколько объектов json с помощью sendall с клиента, сервер зависает и не будет обрабатывать json.loads в функции handle_client.
Это всего лишь пример, так как я учусь использовать сокетыи потоки потоков в питоне.В конце концов мне понадобятся постоянные соединения.Любое объяснение, почему оно зависает, высоко ценится.Спасибо!
Сервер
import sys, socket, threading, json, time, concurrent.futures
HOST = socket.gethostbyname(socket.gethostname())
PORT = 65000
TIMEOUT = 5
MAX_CLIENTS = 5
BUFFER_SIZE = 1024
ENCODING_TYPE = 'utf-8'
clients = []
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT))
server.settimeout(TIMEOUT)
server.setblocking(0)
server.listen(MAX_CLIENTS)
print("Server started successfully")
Pool = concurrent.futures.ThreadPoolExecutor(max_workers=5)
def handle_client(client):
if client not in clients:
clients.append(client)
print('%s clients connected.' % len(clients))
while True:
data = client.recv(BUFFER_SIZE).decode(ENCODING_TYPE)
if data:
jsonObj = json.loads(data)
client.sendall('Keep up the great work!'.encode(ENCODING_TYPE))
else:
clients.remove(client)
client.close()
print('%(name)s is a %(occupation)s!' % {'name': jsonObj['name'], 'occupation': jsonObj['occupation']})
while True:
try:
client, addr = server.accept()
client.setblocking(0)
Pool.submit(handle_client, client)
Pool.shutdown(wait=False)
except BlockingIOError:
pass
server.close()
print('Server shutdown')
sys.exit()
Клиент
import sys, socket, json, time
HOST = socket.gethostbyname(socket.gethostname())
PORT = 65000
BUFFER_SIZE = 1024
ENCODING_TYPE = 'utf-8'
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))
data1 = {
'name': 'John Doe',
'age': 23,
'occupation': 'QA Engineer',
'employer': 'Samsung'
}
data2 = {
'name': 'Jane Roe',
'age': 32,
'occupation': 'HR Representative',
'employer': 'Samsung'
}
packet1 = json.dumps(data1)
packet2 = json.dumps(data2)
client.sendall(packet1.encode(ENCODING_TYPE))
client.sendall(packet2.encode(ENCODING_TYPE))
while True:
response = client.recv(BUFFER_SIZE).decode(ENCODING_TYPE)
print(response)
client.close()
print('Client terminated')