Initial commit

This commit is contained in:
2018-09-24 11:37:21 +02:00
parent 213e0a2d2b
commit 25c543fa3b
12 changed files with 290 additions and 0 deletions

3
objects/__init__.py Normal file
View File

@@ -0,0 +1,3 @@
from . import glob
from . import client
from . import server

50
objects/client.py Normal file
View File

@@ -0,0 +1,50 @@
from importlib import reload
import re
import socket
from handlers import serverPingHandler, mainHandler
class Client:
BUFF_SIZE = 65535
HANDLERS = {
re.compile(b"SAMP"): serverPingHandler
}
def __init__(self, server, addr):
self.server = server
self.addr = addr
self.state = 0
self.__writebuffer = []
def handle_data(self, data):
found = False
for pattern, handler in self.HANDLERS.items():
if pattern.match(data):
queue = handler.handle(self, data)
if queue:
self.write_to_buffer(queue)
found = True
if not found:
queue = mainHandler.handle(self, data)
if queue:
self.write_to_buffer(queue)
#print("?[{}] -> {} / {}".format(self.addr, data, data.hex()))
def write_to_buffer(self, data):
if type(data) == bytes:
self.__writebuffer.append(data)
else:
self.__writebuffer += data
def write_buffer_size(self):
return len(self.__writebuffer)
def write_socket(self):
if len(self.__writebuffer) > 0:
write_chunk = self.__writebuffer.pop(0)
print("[{}] <- {}".format(self.addr, write_chunk))
self.server.socket.sendto(write_chunk, self.addr)
def restart():
reload(serverPingHandler)

2
objects/glob.py Normal file
View File

@@ -0,0 +1,2 @@
config = None
server = None

56
objects/server.py Normal file
View File

@@ -0,0 +1,56 @@
import socket
import select
from threading import Thread
from .client import Client
class Server(Thread):
BUFF_SIZE = 65535
def __init__(self, host, port):
super(Server, self).__init__()
self.daemon = True
self.host = host
self.port = port
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind((self.host, self.port))
self.socket.setblocking(0)
self.clients = {}
def run(self):
# Main server loop
while True:
(incomming, _, _) = select.select(
[self.socket],
[],
[], 1)
if incomming:
data, addr = self.socket.recvfrom(self.BUFF_SIZE)
if addr in self.clients:
self.clients[addr].handle_data(data)
else:
try:
self.clients[addr] = Client(self, addr)
print("[Server] Accepted connection from {}:{}".format(addr[0], addr[1]))
self.clients[addr].handle_data(data)
except socket.error:
try:
self.socket.close()
except:
pass
print("[Server] Something went very wrong...")
exit()
clients = [x for x in self.clients.values()
if x.write_buffer_size() > 0]
for client in clients:
client.write_socket()
for c in self.clients.values():
print(c.__writebuffer)