Additional thread for sending

This commit is contained in:
Fierelier 2021-04-09 18:51:02 +02:00
parent 7a1ec5d0ba
commit 4c12ffc375
2 changed files with 45 additions and 11 deletions

View File

@ -21,6 +21,7 @@ sp = pUp(s)
import threading
import socket
import struct
import time
addr = ("127.0.0.1",21779)
@ -79,20 +80,48 @@ def addEventHandler(event,func):
def sendResponse(connection,data):
connection.sendall(len(data).to_bytes(4,"big") + data)
class connectionThread(threading.Thread):
global threadsLock
class senderThread(threading.Thread):
def __init__(self,connectionThread):
threading.Thread.__init__(self)
self.lock = threading.Lock()
with self.lock:
self.connectionThread = connectionThread
self.queue = []
def closeThread(self):
with self.lock:
self.queue = [["close"]]
def addToQueue(self,entry):
with self.lock:
self.queue.append(entry)
def run(self):
while True:
time.sleep(0.0333)
with self.lock:
if len(self.queue) == 0: continue
for entry in self.queue:
if entry[0] == "close": return
entry[0](*entry[1],**entry[2])
self.queue = []
class connectionThread(threading.Thread):
def __init__(self,threadId,connection,address):
threading.Thread.__init__(self)
self.threadId = threadId
self.connection = connection
self.address = address
self.closed = False
self.user = False
self.lock = threading.Lock()
with self.lock:
self.threadId = threadId
self.connection = connection
self.address = address
self.closed = False
self.user = False
self.senderThread = senderThread(self)
self.senderThread.start()
def closeThread(self):
with self.lock, threadsLock:
self.senderThread.closeThread()
try:
self.connection.close()
except:
@ -103,8 +132,11 @@ class connectionThread(threading.Thread):
print("thread closed: " +str(self.threadId)+ " (open: " +str(len(threads))+ ")")
self.closed = True
def sendResponse(self,data):
with self.lock:
self.senderThread.addToQueue([sendResponse,[self.connection,data],{}])
def run(self):
# inform about connection
with self.lock:
print("thread opened: " +", ".join((str(self.threadId),str(self.address))))
@ -179,6 +211,8 @@ def main():
global close
while True:
connection, address = socketServer.accept()
# inform about connection
with threadsLock:
if close: break
cancel = triggerEvent("onConnect",connection,address)

View File

@ -43,7 +43,7 @@ def textOnRequest(event,self,requestLength):
response = textCommandRun(self,textCommandToList(text))
print("response: " +textListToCommand(response))
sendResponse(self.connection,textListToCommand(response).encode("utf-8"))
self.sendResponse(textListToCommand(response).encode("utf-8"))
self.connection.settimeout(textKeepAliveTimeout)
addEventHandler("onRequest",textOnRequest)
@ -52,8 +52,8 @@ global textOnException
def textOnException(event,self,exc):
self.connection.settimeout(textTimeout)
if type(exc) == socket.timeout:
sendResponse(self.connection,textListToCommand(["error","fatal","timeout"]).encode("utf-8"))
self.sendResponse(textListToCommand(["error","fatal","timeout"]).encode("utf-8"))
return
sendResponse(self.connection,textListToCommand(["error","fatal","unhandled",str(exc)]).encode("utf-8"))
self.sendResponse(textListToCommand(["error","fatal","unhandled",str(exc)]).encode("utf-8"))
addEventHandler("onException",textOnException)