khalid
khalid

Reputation: 9

PYTHON TCP SERVER can not support multiple Client Request

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

Client 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))

Server Code

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')

Config.json file

{
  "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

Answers (0)

Related Questions