Advertisement
Guest User

reaper_server.py

a guest
Oct 4th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.78 KB | None | 0 0
  1. from sws_python import *
  2. from socket import *
  3. from select import select
  4. import pickle
  5. import struct
  6.  
  7. # debug_mode = False
  8. debug_mode = True
  9.  
  10.  
  11. def console_message(*args, sep=' ', end='\n'):
  12.     if debug_mode:
  13.         RPR_ShowConsoleMsg(f'{sep.join(map(str, args))}{end}')
  14.  
  15.  
  16. port = 9009
  17.  
  18. server_socket = socket(AF_INET, SOCK_STREAM)
  19. server_socket.setblocking(False)
  20. server_socket.settimeout(0)
  21.  
  22. while True:
  23.     try:
  24.         server_socket.bind(('localhost', port))
  25.         break
  26.     except OSError:
  27.         port += 1
  28.  
  29. console_message('Server opened on port', port)
  30. RPR_SetExtState('server', 'port', port, False)
  31. server_socket.listen(5)
  32.  
  33. client_sockets = []
  34. empty_list = []
  35.  
  36. def loop():
  37.     # accept a new client if available
  38.     try:
  39.         new_client_socket, new_client_address = server_socket.accept()
  40.         console_message('New connection from:', new_client_address)
  41.         client_sockets.append(new_client_socket)
  42.         console_message('clients:', *map(lambda client: client.getpeername(), client_sockets))
  43.  
  44.     except BlockingIOError:
  45.         pass
  46.  
  47.     # process a request, if available
  48.     if len(client_sockets):
  49.         ready_clients, _, _ = select(client_sockets, empty_list, empty_list, 0)
  50.         for client_socket in ready_clients: # type: socket
  51.             #console_message('ready clients:', ready_clients)
  52.             try:
  53.                 message_size = client_socket.recv(4)
  54.                 if message_size:
  55.                     message_size = struct.unpack('<I', message_size)[0]
  56.                 else:
  57.                     raise ConnectionError
  58.  
  59.                 message = client_socket.recv(message_size)
  60.                 if message:
  61.                     console_message('Message from', client_socket.getpeername(), '-', message)
  62.                     result = None
  63.                     try:
  64.                         result = eval(message)
  65.                         result = pickle.dumps(result, protocol=pickle.HIGHEST_PROTOCOL)
  66.  
  67.                     except Exception as e:
  68.                         result = pickle.dumps(e, protocol=pickle.HIGHEST_PROTOCOL)
  69.  
  70.                     client_socket.send(struct.pack('<I', len(result)) + result)
  71.                 else:
  72.                     raise ConnectionError
  73.  
  74.             except ConnectionError:
  75.                 console_message("Client", client_socket.getpeername(), "disconnected.")
  76.                 client_socket.close()
  77.                 client_sockets.remove(client_socket)
  78.                 console_message('clients:', *map(lambda client: client.getpeername(), client_sockets))
  79.                 continue
  80.             break
  81.  
  82.     # enqueue next cycle
  83.     RPR_defer('loop()')
  84.  
  85. if __name__ == '__main__':
  86.     console_message('Awaiting connections...')
  87.     #RPR_atexit('server_socket.close()')
  88.     RPR_defer('loop()')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement