Initial commit
This commit is contained in:
3
objects/__init__.py
Normal file
3
objects/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from . import glob
|
||||
from . import client
|
||||
from . import server
|
||||
50
objects/client.py
Normal file
50
objects/client.py
Normal 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
2
objects/glob.py
Normal file
@@ -0,0 +1,2 @@
|
||||
config = None
|
||||
server = None
|
||||
56
objects/server.py
Normal file
56
objects/server.py
Normal 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)
|
||||
Reference in New Issue
Block a user