Source code for ginsfsm.examples.essential_gobjs.stress_server_echo

"""
GObj :class:`OnServer`
======================

Stress with many connections and many data.

To run with :mod:`ginsfsm.examples.stress_client_echo`

The server echo the data.

It uses :class:`ginsfsm.c_srv_sock.GServerSock`.

.. autoclass:: OnServer
    :members:

"""

import logging
logging.basicConfig(level=logging.DEBUG)

from ginsfsm.gobj import GObj
from ginsfsm.gaplic import GAplic
from ginsfsm.c_timer import GTimer
from ginsfsm.c_srv_sock import GServerSock

#===============================================================
#                   Server
#===============================================================
n_connected_clisrv = 0


def ac_clisrv_timeout(self, event):
    self.set_timeout(10)
    print("Server's clients: %d, connected %d" % (
        len(self.dl_childs), n_connected_clisrv))


def ac_clisrv_connected(self, event):
    global n_connected_clisrv
    n_connected_clisrv += 1


def ac_clisrv_disconnected(self, event):
    global n_connected_clisrv
    n_connected_clisrv -= 1
    self.destroy_gobj(event.source[-1])


def ac_clisrv_rx_data(self, event):
    #print 'recibo:', event.data
    # Do echo
    self.send_event(event.source[-1], 'EV_SEND_DATA', data=event.data)


SERVER_FSM = {
    'event_list': (
        'EV_SET_TIMER: bottom output',
        'EV_TIMEOUT: bottom input',
        'EV_CONNECTED: bottom input',
        'EV_DISCONNECTED: bottom input',
        'EV_RX_DATA:bottom input',
    ),
    'state_list': ('ST_IDLE',),
    'machine': {
        'ST_IDLE':
        (
            ('EV_TIMEOUT',          ac_clisrv_timeout,         'ST_IDLE'),
            ('EV_CONNECTED',        ac_clisrv_connected,       'ST_IDLE'),
            ('EV_DISCONNECTED',     ac_clisrv_disconnected,    'ST_IDLE'),
            ('EV_RX_DATA',          ac_clisrv_rx_data,         'ST_IDLE'),
        ),
    }
}


SERVER_GCONFIG = {  # type, default_value, flag, validate_function, desc
    'verbose': [int, 1, 0, None, "Increase output verbosity. Values [0,1,2]"],
}


[docs]class OnServer(GObj): """ Server GObj. .. ginsfsm:: :fsm: SERVER_FSM :gconfig: SERVER_GCONFIG *Input-Events:* * :attr:`'EV_TIMEOUT'`: Timer over. Start the machine. * :attr:`'EV_CONNECTED'`: New client. * :attr:`'EV_DISCONNECTED'`: Client disconnected. * :attr:`'EV_RX_DATA'`: Receiving data. *Output-Events:* * :attr:`'EV_START_TIMER'`: Start timer. """ def __init__(self): GObj.__init__(self, SERVER_FSM, SERVER_GCONFIG) def start_up(self): self.timer = self.create_gobj( None, GTimer, self) self.set_timeout(5) self.server = self.create_gobj( None, GServerSock, self, host='0.0.0.0', port=8000, transmit_ready_event_name=None, ) def set_timeout(self, seconds): self.send_event(self.timer, 'EV_SET_TIMER', seconds=seconds) def clear_timeout(self): self.send_event(self.timer, 'EV_SET_TIMER', seconds=-1) #=============================================================== # Main #===============================================================
if __name__ == "__main__": local_conf = { 'GObj.trace_mach': True, 'GObj.logger': logging, } ga_srv = GAplic(name='server', roles='', **local_conf) ga_srv.create_gobj( 'server', OnServer, ga_srv, ) try: ga_srv.start() except (KeyboardInterrupt, SystemExit): print('Program stopped')