Skip to content

Instantly share code, notes, and snippets.

@jinie
Last active December 20, 2015 04:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jinie/6074531 to your computer and use it in GitHub Desktop.
Save jinie/6074531 to your computer and use it in GitHub Desktop.
#!/usr/bin/python
import socket
from threading import Thread
from Queue import Queue, Empty
class ClientSender(Thread):
def __init__(self, sock, queue):
super(ClientSender, self).__init__()
self.socket = sock
self.queue = queue
def run(self):
print("Starting sender thread for socket %s", self.socket)
while 1:
try:
data = self.queue.get(True, None)
if(data == ''):
self.queue.task_done()
break
print("Sending data : %s" % data)
self.socket.send(data.encode('utf-8'))
self.queue.task_done()
except Exception as e:
print(e)
raise e
class ClientReceiver(Thread):
def __init__(self, sock, queue):
super(ClientReceiver, self).__init__()
self.socket = sock
self.queue = queue
def run(self):
print("Starting receiver thread for socket %s", self.socket)
rbuf = ""
while(1):
rbuf = self.socket.recv(99999)
if len(rbuf) == 0:
print("connection closed")
self.queue.put('')
break
print("Received %s" % rbuf)
self.queue.put(rbuf.decode('utf-8'))
class Client(Thread):
def __init__(self, sock):
super(Client, self).__init__()
self.sock = sock
def run(self):
print("Starting new thread for socket %s" % self.sock)
sender_queue = Queue()
receiver_queue = Queue()
sender = ClientSender(self.sock, sender_queue)
receiver = ClientReceiver(self.sock, receiver_queue)
sender.start()
receiver.start()
done = False
while(not done):
try:
request = receiver_queue.get(True, 1)
if(request == ''):
sender_queue.put(request)
done = True
else:
#Do something with received data
receiver_queue.task_done()
except Empty:
#timeout, send heartbeat ?
pass
sender_queue.join()
receiver_queue.join()
self.sock.close()
def main():
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 3333))
serversocket.listen(5)
print ('listening')
while 1:
(clientsocket, address) = serversocket.accept()
print("connect from ", address)
Client(clientsocket).start()
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment