Implement multithreaded server

This commit is contained in:
XANTRONIX Development 2024-11-26 16:55:44 -05:00
parent 1e1ffabd72
commit 01d2b34452
2 changed files with 28 additions and 4 deletions

View file

@ -1,8 +1,11 @@
import enum
import socket
import threading
from typing import Callable
from nntp.tiny.newsgroup import Newsgroup
from nntp.tiny.session import Session
class ServerCapability(enum.Flag):
NONE = 0
@ -22,3 +25,17 @@ class Server():
for newsgroup in db.query(Newsgroup).each():
self.newsgroups[newsgroup.name.casefold()] = newsgroup
def run(self):
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener.bind(('localhost', 1190))
listener.listen()
while True:
sock, addr = listener.accept()
session = Session(self, sock)
thread = threading.Thread(target=session.handle)
thread.start()
listener.close()

View file

@ -9,7 +9,6 @@ from typing import Optional
from nntp.tiny.buffer import LineBuffer, BufferOverflow
from nntp.tiny.db import Database
from nntp.tiny.server import Server, ServerCapability
from nntp.tiny.response import Response, ResponseCode
from nntp.tiny.newsgroup import Newsgroup
from nntp.tiny.message import Message
@ -104,8 +103,8 @@ class Session():
RE_SPLIT = re.compile(r'\s+')
def __init__(self, server: Server, sock: socket.socket):
self.server: Server = server
def __init__(self, server, sock: socket.socket):
self.server = server
self.db: Database = server.connect_to_db()
self.sock: socket.socket = sock
self.buf: LineBuffer = LineBuffer()
@ -739,7 +738,7 @@ class Session():
def greet(self):
return self.respond(ResponseCode.NNTP_SERVICE_READY_POST_PROHIBITED)
def handle(self):
def handle_command(self):
line = self.readline()
if line == '':
@ -761,3 +760,11 @@ class Session():
except Exception as e:
traceback.print_exception(e)
return self.respond(ResponseCode.NNTP_COMMAND_UNAVAILABLE)
def handle(self):
self.greet()
while self.state & SessionState.ACTIVE:
self.handle_command()
self.sock.close()