Skip to content

Instantly share code, notes, and snippets.

@codecakes
Last active December 30, 2016 17:20
Show Gist options
  • Save codecakes/cf5c9ec045909cdcc96b89717d93198d to your computer and use it in GitHub Desktop.
Save codecakes/cf5c9ec045909cdcc96b89717d93198d to your computer and use it in GitHub Desktop.
a simple echo server gevent socket sock_stream that connects with 5 clients and echoes back the message
import gevent
from gevent.server import StreamServer as gStream
from gevent import socket as gsocket
from gevent import select as gselect
from collections import deque, defaultdict
def divide(alist, lo, hi, fn, *args):
if lo < hi:
mid = (hi-lo)/2 + lo
divide(alist, lo, mid, fn, *args)
divide(alist, mid+1, hi, fn, *args)
else:
# print "alist", alist
if alist:
print "printing client", alist[lo]
fn(alist[lo], *args)
def put_conn_list(client, mQ, server):
if client is server:
conn, client_addr = client.accept()
conn.setblocking(0)
inputs.append(conn)
else:
data = client.recv(1024)
if data:
mQ[client].appendleft(data)
if client not in outputs: outputs.append(client)
else:
if client in outputs: outputs.remove(client)
inputs.remove(client)
if not client.closed:
print "closing client connection from server"
client.close()
print "popping client because no data", mQ.pop(client)
def send_client(client, mQ):
if mQ.has_key(client):
if mQ[client]: client.send(mQ[client].pop())
def send_err(client, mQ):
inputs.remove(client)
if client in outputs: outputs.remove(client)
if not client.closed: client.close()
def process_server(inputs, outputs):
mQ = defaultdict(deque)
server_address = ('', 8100)
server = gsocket.socket(gsocket.AF_INET, gsocket.SOCK_STREAM)
server.setblocking(0)
server.bind(server_address)
# Listen for incoming connections
server.listen(5)
inputs.append(server)
while input:
try:
rlist, wlist, errlist = gselect.select(inputs, outputs, [])
# handle inputs
handle_input = gevent.spawn( divide(rlist, 0, len(rlist)-1, put_conn_list, mQ, server) )
# handle outputs
handle_output = gevent.spawn( divide(wlist, 0, len(wlist)-1, send_client, mQ) )
# handle errlist
handle_err = gevent.spawn( divide(errlist, 0, len(errlist)-1, send_err, mQ) )
gevent.joinall([handle_input, handle_output, handle_err])
except Exception as e:
print "closing server", e
server.shutdown(gsocket.SHUT_RDWR)
server.close()
server = gsocket.socket(gsocket.AF_INET, gsocket.SOCK_STREAM)
server.setblocking(0)
server.bind(server_address)
# Listen for incoming connections
server.listen(5)
"""
# what a client connection could be
from gevent import socket as gsocket
def send_recv_client(client, msg):
client.send(msg)
data = client.recv(1024)
print "received", data
server_address = ('localhost', 8100)
clientA = gsocket.socket(gsocket.AF_INET, gsocket.SOCK_STREAM)
clientA.connect(server_address)
"""
inputs = []
outputs = []
process_server(inputs, outputs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment