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:
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())