Reputation: 9
I am writing asynchronous Server socket using asyncore and i have some challenges. to test the performance i create a TCP client that will send several message to the server but i noticed that whenever i exceed 20 simultanous messages i got the below error and some the messages are not received.
OSError: [WinError 10057]
I can't figure out what is the issue.
Below are the client and server code
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
}
Please help if you have any idea
Thanks in advance.
Upvotes: 0
Views: 64