Implement multithreaded server
This commit is contained in:
parent
1e1ffabd72
commit
01d2b34452
2 changed files with 28 additions and 4 deletions
|
@ -1,8 +1,11 @@
|
||||||
import enum
|
import enum
|
||||||
|
import socket
|
||||||
|
import threading
|
||||||
|
|
||||||
from typing import Callable
|
from typing import Callable
|
||||||
|
|
||||||
from nntp.tiny.newsgroup import Newsgroup
|
from nntp.tiny.newsgroup import Newsgroup
|
||||||
|
from nntp.tiny.session import Session
|
||||||
|
|
||||||
class ServerCapability(enum.Flag):
|
class ServerCapability(enum.Flag):
|
||||||
NONE = 0
|
NONE = 0
|
||||||
|
@ -22,3 +25,17 @@ class Server():
|
||||||
|
|
||||||
for newsgroup in db.query(Newsgroup).each():
|
for newsgroup in db.query(Newsgroup).each():
|
||||||
self.newsgroups[newsgroup.name.casefold()] = newsgroup
|
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()
|
||||||
|
|
|
@ -9,7 +9,6 @@ from typing import Optional
|
||||||
|
|
||||||
from nntp.tiny.buffer import LineBuffer, BufferOverflow
|
from nntp.tiny.buffer import LineBuffer, BufferOverflow
|
||||||
from nntp.tiny.db import Database
|
from nntp.tiny.db import Database
|
||||||
from nntp.tiny.server import Server, ServerCapability
|
|
||||||
from nntp.tiny.response import Response, ResponseCode
|
from nntp.tiny.response import Response, ResponseCode
|
||||||
from nntp.tiny.newsgroup import Newsgroup
|
from nntp.tiny.newsgroup import Newsgroup
|
||||||
from nntp.tiny.message import Message
|
from nntp.tiny.message import Message
|
||||||
|
@ -104,8 +103,8 @@ class Session():
|
||||||
|
|
||||||
RE_SPLIT = re.compile(r'\s+')
|
RE_SPLIT = re.compile(r'\s+')
|
||||||
|
|
||||||
def __init__(self, server: Server, sock: socket.socket):
|
def __init__(self, server, sock: socket.socket):
|
||||||
self.server: Server = server
|
self.server = server
|
||||||
self.db: Database = server.connect_to_db()
|
self.db: Database = server.connect_to_db()
|
||||||
self.sock: socket.socket = sock
|
self.sock: socket.socket = sock
|
||||||
self.buf: LineBuffer = LineBuffer()
|
self.buf: LineBuffer = LineBuffer()
|
||||||
|
@ -739,7 +738,7 @@ class Session():
|
||||||
def greet(self):
|
def greet(self):
|
||||||
return self.respond(ResponseCode.NNTP_SERVICE_READY_POST_PROHIBITED)
|
return self.respond(ResponseCode.NNTP_SERVICE_READY_POST_PROHIBITED)
|
||||||
|
|
||||||
def handle(self):
|
def handle_command(self):
|
||||||
line = self.readline()
|
line = self.readline()
|
||||||
|
|
||||||
if line == '':
|
if line == '':
|
||||||
|
@ -761,3 +760,11 @@ class Session():
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exception(e)
|
traceback.print_exception(e)
|
||||||
return self.respond(ResponseCode.NNTP_COMMAND_UNAVAILABLE)
|
return self.respond(ResponseCode.NNTP_COMMAND_UNAVAILABLE)
|
||||||
|
|
||||||
|
def handle(self):
|
||||||
|
self.greet()
|
||||||
|
|
||||||
|
while self.state & SessionState.ACTIVE:
|
||||||
|
self.handle_command()
|
||||||
|
|
||||||
|
self.sock.close()
|
||||||
|
|
Loading…
Add table
Reference in a new issue