Websocket server for gevent.pywsgi
Project description
gevent-ws
A fast, MIT-licensed alternative to the abandoned non-free (as in freedom) gevent-websocket.
Why?
It's MIT-licensed, so it can be included to almost all software (both open-source and closed-source) without any licensing issues, as opposed to gevent-websocket. And it's several times faster!
Installation
gevent-ws can be installed from PyPI and GitHub.
PyPI
$ pip3 install gevent-ws
GitHub
$ git clone https://github.com/imachug/gevent-ws.git
$ cd gevent-ws
$ python3 setup.py install
Example
A simple echo server
from gevent.pywsgi import WSGIServer
from gevent_ws import WebSocketHandler
def app(env, start_response):
ws = env["wsgi.websocket"]
while True:
msg = ws.receive()
if msg is None:
break
ws.send(msg)
return [b"Bye"]
server = WSGIServer(("", 8080), app, handler_class=WebSocketHandler)
server.serve_forever()
Both HTTP and websocket on a single port
from gevent.pywsgi import WSGIServer
from gevent_ws import WebSocketHandler
def app(env, start_response):
if "wsgi.websocket" in env:
ws = env["wsgi.websocket"]
while True:
msg = ws.receive()
if msg is None:
break
ws.send(msg)
return [b"Bye"]
else:
start_response("200 OK", [
("Content-Type", "text/html, charset=utf-8")
])
return [
b"""
<script>
const ws = new WebSocket("ws://127.0.0.1:8080/");
ws.onopen = () => {
ws.send("Hello, world!");
};
ws.onmessage = e => {
ws.send(e.data);
};
</script>
"""
]
server = WSGIServer(("", 8080), app, handler_class=WebSocketHandler)
server.serve_forever()
Docs
gevent_ws.WebSocketHandler
The main class. Pass it to gevent.pywsgi.WSGIServer
as handler_class
.
gevent_ws.WebSocket
You get this object by accessing wsgi.websocket
property of the environment object. If it exists, it's a websocket connection; if it doesn't, it's an HTTP request. You can use "wsgi.websocket" in env
to check this and route the request correctly.
gevent_ws.WebSocket.receive()
Waits for a message and returns it, either as str
or bytes
. Blocks. May return None
if the connection is closed or an OSError
if the socket can't be read from.
gevent_ws.WebSocket.receive_nowait()
Returns the message if it's available (the format is the same as in receive()
) or None
if no message is in the queue. May return None
or raise OSError
(see receive()
).
gevent_ws.WebSocket.send(message)
Sends a message to the other party. message
can be either str
or bytes
. May raise EOFError
if the connection is closed or OSError
if the message can't be sent for some other reason.
gevent_ws.WebSocket.close(status=1000)
Closes the websocket. Status 1000
(the default one) means that the connection is closed cleanly. Check RFC for more status codes.
gevent_ws.WebSocket.set_max_message_length(length)
Set maximum incoming message size (in bytes). 10 MiB is the default value.
gevent_ws.WebSocket.closed
A boolean showing whether the connection is closed (by any of the two parties) or is being closed.
gevent_ws.WebSocket.status
The close status code sent by the other party. None
if the socket was closed by the client, the server didn't return the error code or the connection was aborted abnormally.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file gevent-ws-2.1.0.tar.gz
.
File metadata
- Download URL: gevent-ws-2.1.0.tar.gz
- Upload date:
- Size: 5.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/41.1.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f69a80dac1c6f353ba338f2570a19d3076be94b49f348a570effd0ab9ffed4a4 |
|
MD5 | 008eaec7d30f84a689c6db914573af1f |
|
BLAKE2b-256 | 04328797ddd58c8f87d2ff07f2198c1b70dd12f2fdf81b95738cc14873537731 |
File details
Details for the file gevent_ws-2.1.0-py3-none-any.whl
.
File metadata
- Download URL: gevent_ws-2.1.0-py3-none-any.whl
- Upload date:
- Size: 6.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/41.1.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | dba0ea1dc87319385728ba32009af7324144dcbaac1139987830b556914ea2a6 |
|
MD5 | ae1ae0f39a137f2b4c6ff1f7983f5f64 |
|
BLAKE2b-256 | f54fa80e131f0d2039a5effce6edd9a6c9365f89dc5b24d64b84666f81fa17dd |