Last active
December 30, 2016 17:20
-
-
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
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 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