Я пишу асинхронный серверный сокет с использованием asyncore, и у меня есть некоторые проблемы. Чтобы проверить производительность, я создаю TCP-клиент, который будет отправлять несколько сообщений на сервер, но я заметил, что всякий раз, когда я превышаю 20 одновременных сообщений, я получаю указанную ниже ошибку, а некоторые сообщения не принимаются.
OSError: [WinError 10057]
Я не могу понять, в чем проблема.
Ниже приведены клиентский и серверный код.
import sys
import threading
import time
import socket
import random
SOCKET_AMOUNT =400
HOST = "192.168.56.1"
PORT = 8889
def myclient(ip, port, message):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect((ip, port))
except Exception as e:
print(e)
sock.sendall(message)
result = sock.recv(2048)
print(result)
sock.close()
return
if __name__ == "__main__":
print(' Start Time {}'.format(time.time()))
thread_list = []
startTime = time.time()
print('START TIME {}. '.format(startTime))
for i in range(SOCKET_AMOUNT):
msg = b'NEXT0421000001200'
client_thread = threading.Thread(
target=myclient, args=(HOST, PORT, msg))
thread_list.append(client_thread)
client_thread.start()
#print(' Middle Time {}'.format(time.time()))
waiting = time.time()
[x.join() for x in thread_list]
done = time.time()
print ('DONE {}. Waiting for {} seconds'.format(done, done-waiting))
endTime = time.time()
print('Operation took {} Secs. '.format(endTime-startTime))
import asyncore
import sys
import socket
import logging
import json
from datetime import datetime
class Server(asyncore.dispatcher):
def __init__(self, host, port):
print ('START SERVER')
self.connections = []
self.authCounter = 0
try:
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind((host, port))
self.listen(confjson.get('SERVER_QUEUE_SIZE',None))
except Exception as e:
raise SystemExit(f'We could not bind the server on host')
def handle_accept(self):
socket, address = self.accept()
print(f'socket @ [{address}]')
self.authCounter += 1
handler = EchoHandler(socket)
class EchoHandler(asyncore.dispatcher):
def __init__(self, sock):
self.chunk_size = 2048
asyncore.dispatcher.__init__(self, sock=sock)
self.data_to_write = []
return
def handle_read(self):
isoMsg = self.recv(rate)
if not isoMsg:
return
isoMsgHex = isoMsg.hex()
# some data processing here
self.data_to_write.insert(0, isoMsg)
def writable(self):
response = bool(self.data_to_write)
return response
def handle_write(self):
data = self.data_to_write.pop()
sent = self.send(data[:len(data)])
if sent < len(data):
remaining = data[sent:]
self.data.to_write.append(remaining)
if not self.writable():
self.handle_close()
def handle_close(self):
self.close()
if __name__ == "__main__":
with open('config.json', 'r') as jfile:
confjson = json.load(jfile)
try:
vPortNumber = confjson.get('PORT', None)
vHostName = confjson.get('HOST', None)
rate = confjson.get('RATE', None)
serverQueue= confjson.get('SERVER_QUEUE_SIZE',None)
server = Server(vHostName,vPortNumber)
asyncore.loop()
except Exception as e:
print(f'e : {e}')
finally:
print('Server Shutdown')
{
"HOST": "127.0.0.1",
"PORT": 8889,
"RATE": 1024,
"SERVER_QUEUE_SIZE": 5
}
Пожалуйста, помогите, если у вас есть идеи
Заранее спасибо.
Обновлено, проверьте сейчас, пожалуйста
Можете ли вы получить какие-либо данные до того, как наберете 20 сообщений послал?
Да, сообщения принимаются сервером, и ошибка возникает на стороне клиента, когда я отправляю больше сообщений. Я также заметил, что иногда я могу набрать 40 сообщений, но редко
Также обратите внимание, что я удаляю часть обработки данных. Все полученные сообщения обрабатываются, и я могу ответить клиенту. Чтобы добавить больше пояснений, когда, например, когда я отправляю 400 сообщений, я получаю процесс и отвечаю клиенту, 80% сообщений, а остальные никогда не принимаются. Когда я отправляю менее 20, а иногда и 40, все сообщения принимаются и обрабатываются
Не могли бы вы уменьшить размер кода, чтобы было легче отвечать?