Я тестирую многопоточность на локальном сервере и клиенте с помощью python.Я посмотрел на множество примеров, но они сделали это по-разному.Я новичок, поэтому мне трудно это понять.Моя проблема с кодом заключается в том, что когда клиент отправляет только одно сообщение, он работает нормально;однако, когда клиент отправляет несколько сообщений (используя цикл for) или несколько клиентов отправляют сообщения одновременно, сервер получает все сообщения одновременно, поэтому он печатает неверным образом.Вот часть моего кода:
для серверной части:
def insert_projects(project):
...
class ThreadNum(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
msg = self.queue.get()
print("Got message", end=' ')
insert_projects(msg)
time.sleep(1)
self.queue.task_done()
def main():
server_address = (server_ip, server_port)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(server_address)
print('socket binded to %s port %s' % server_address)
sock.listen(5)
print('socket is listening')
connection, client_address = sock.accept()
for i in range(100):
t = ThreadNum(queue)
t.setDaemon(True)
t.start()
while True:
data = connection.recv(buf_size)
data = ast.literal_eval(data.decode('utf-8'))
print('received ', data)
str_message = str(data)
queue.put(str_message)
queue.join()
Функция insert_projects предназначена только для вставки информации о сообщении в базу данных mysql, поэтому она не влияет на эту часть.
для клиентской части:
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect the socket to the port where the server is listening
server_address = (server_ip, server_port)
print('connecting to %s port %s' % server_address)
sock.connect(server_address)
try:
# Input data
for i in range(3):
message = {"Project":"KF#2","Type":"GW1","Qty":"12345678","DATE":"18/05/24","TIME":"14:16:20"}
# Send data
print('sending ', message)
sock.sendall(str(message).encode('utf-8'))
finally:
print('closing socket')
sock.close()
Может кто-нибудь помочь мне, как разделить полученные сообщения одно за другим в очередь?