Last active
June 9, 2020 15:04
-
-
Save joonty/6463568 to your computer and use it in GitHub Desktop.
A vim-friendly, thread and queue based socket server written in python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
import socket | |
import select | |
import Queue | |
import threading | |
import time | |
class EchoServer(threading.Thread): | |
def __init__(self, host, port, message_queue, output_queue): | |
self.__message_queue = message_queue | |
self.__output_queue = output_queue | |
self.__host = host | |
self.__port = port | |
threading.Thread.__init__(self) | |
def run(self): | |
try: | |
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
s.setblocking(0) | |
s.bind((self.__host, self.__port)) | |
s.listen(5) | |
while 1: | |
try: | |
self.check_exit() | |
client, address = s.accept() | |
print client, address | |
while 1: | |
self.check_exit() | |
if not self.handle_client(client): | |
client.close() | |
break | |
except socket.error: | |
pass | |
except Exception: | |
print "Error:" | |
print sys.exc_info() | |
print "Stopping socket server" | |
def handle_client(self, client): | |
data = client.recv(1024) | |
if data == "": | |
print "Client connection closed" | |
return False | |
else: | |
self.__output_queue.put_nowait(data) | |
client.send(data) | |
return True | |
def check_exit(self): | |
try: | |
if self.__message_queue.get_nowait() == "exit": | |
raise Exception("Exiting") | |
except Queue.Empty: | |
pass | |
class Runner: | |
def __init__(self): | |
self.__output_queue = Queue.Queue(0) | |
self.__message_queue = Queue.Queue(0) | |
def run(self): | |
server = EchoServer('127.0.0.1', 50000, self.__message_queue, self.__output_queue) | |
server.start() | |
print "Starting echo server thread" | |
def read(self): | |
try: | |
return self.__output_queue.get_nowait() | |
except Queue.Empty: | |
print "Empty queue" | |
return False | |
def stop(self): | |
print "Sending exit message to socket thread" | |
self.__message_queue.put("exit") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment