Skip to content

Instantly share code, notes, and snippets.

@joonty
Last active June 9, 2020 15:04
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save joonty/6463568 to your computer and use it in GitHub Desktop.
Save joonty/6463568 to your computer and use it in GitHub Desktop.
A vim-friendly, thread and queue based socket server written in python
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