kore

a fork of the worlds most advanced web framework
Log | Files | Refs | README | LICENSE

commit 6080bb1c3523a5146d958a58de0fce6833ffc9db
parent 545d48e65d2ea79d6bf96e519e26dd1c6f7208be
Author: Joris Vink <joris@coders.se>
Date:   Mon, 15 Oct 2018 20:37:51 +0200

echo server example in Python with new async/await.

Diffstat:
Aexamples/python-echo/.gitignore | 6++++++
Aexamples/python-echo/conf/build.conf | 34++++++++++++++++++++++++++++++++++
Aexamples/python-echo/conf/python-echo.conf | 3+++
Aexamples/python-echo/src/echo.py | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 101 insertions(+), 0 deletions(-)

diff --git a/examples/python-echo/.gitignore b/examples/python-echo/.gitignore @@ -0,0 +1,6 @@ +*.o +.flavor +.objs +python-echo +assets.h +cert diff --git a/examples/python-echo/conf/build.conf b/examples/python-echo/conf/build.conf @@ -0,0 +1,34 @@ +# python-echo build config +# You can switch flavors using: kodev flavor [newflavor] + +# Set to yes if you wish to produce a single binary instead +# of a dynamic library. If you set this to yes you must also +# set kore_source together with kore_flavor. +single_binary=yes +kore_source=../../ +kore_flavor=NOTLS=1 PYTHON=1 + +# The flags below are shared between flavors +cflags=-Wall -Wmissing-declarations -Wshadow +cflags=-Wstrict-prototypes -Wmissing-prototypes +cflags=-Wpointer-arith -Wcast-qual -Wsign-compare + +cxxflags=-Wall -Wmissing-declarations -Wshadow +cxxflags=-Wpointer-arith -Wcast-qual -Wsign-compare + +# Mime types for assets served via the builtin asset_serve_* +#mime_add=txt:text/plain; charset=utf-8 +#mime_add=png:image/png +#mime_add=html:text/html; charset=utf-8 + +dev { + # These flags are added to the shared ones when + # you build the "dev" flavor. + cflags=-g + cxxflags=-g +} + +#prod { +# You can specify additional flags here which are only +# included if you build with the "prod" flavor. +#} diff --git a/examples/python-echo/conf/python-echo.conf b/examples/python-echo/conf/python-echo.conf @@ -0,0 +1,3 @@ +# python-echo configuration + +python_import src/echo.py diff --git a/examples/python-echo/src/echo.py b/examples/python-echo/src/echo.py @@ -0,0 +1,58 @@ +# +# Copyright (c) 2013-2018 Joris Vink <joris@coders.se> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# + +import kore +import socket + +class EchoServer: + # Setup socket + wrap it inside of a kore socket so we can use it. + def __init__(self): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.setblocking(False) + sock.bind(("127.0.0.1", 6969)) + sock.listen() + + self.conn = kore.socket_wrap(sock) + + # Wait for a new client to connect, then create a new task + # that calls handle_client with the ocnnected client as + # the argument. + async def run(self): + while True: + try: + client = await self.conn.accept() + kore.task_create(self.handle_client(client)) + client = None + except Exception as e: + kore.fatal("exception %s" % e) + + # Each client will run as this co-routine. + async def handle_client(self, client): + while True: + try: + data = await client.recv(1024) + if data is None: + break + await client.send(data) + except Exception as e: + print("client got exception %s" % e) + client.close() + +# Setup the server object. +server = EchoServer() + +# Create a task that will execute inside of Kore as a co-routine. +kore.task_create(server.run())