Project: socketio-client

A socket.io client library

Project Details

Latest version
0.7.2
Home Page
https://github.com/invisibleroads/socketIO-client
PyPI Page
https://pypi.org/project/socketio-client/

Project Popularity

PageRank
0.0020091251222434316
Number of downloads
105202

.. image:: https://travis-ci.org/invisibleroads/socketIO-client.svg?branch=master :target: https://travis-ci.org/invisibleroads/socketIO-client

socketIO-client

Here is a socket.io <http://socket.io>_ client library for Python. You can use it to write test code for your socket.io server.

Please note that this version implements socket.io protocol 1.x <https://github.com/automattic/socket.io-protocol>, which is not backwards compatible. If you want to communicate using socket.io protocol 0.9 <https://github.com/learnboost/socket.io-spec> (which is compatible with gevent-socketio <https://github.com/abourget/gevent-socketio>), please use socketIO-client 0.5.7.2 <https://pypi.python.org/pypi/socketIO-client/0.5.7.2>.

Installation

Install the package in an isolated environment. ::

VIRTUAL_ENV=$HOME/.virtualenv

# Prepare isolated environment
virtualenv $VIRTUAL_ENV

# Activate isolated environment
source $VIRTUAL_ENV/bin/activate

# Install package
pip install -U socketIO-client

Usage

Activate isolated environment. ::

VIRTUAL_ENV=$HOME/.virtualenv
source $VIRTUAL_ENV/bin/activate

Launch your socket.io server. ::

cd $(python -c "import os, socketIO_client;\
    print(os.path.dirname(socketIO_client.__file__))")

DEBUG=* node tests/serve.js  # Start socket.io server in terminal one
DEBUG=* node tests/proxy.js  # Start proxy server in terminal two
nosetests                    # Run tests in terminal three

For debugging information, run these commands first. ::

import logging
logging.getLogger('socketIO-client').setLevel(logging.DEBUG)
logging.basicConfig()

Emit. ::

from socketIO_client import SocketIO, LoggingNamespace

with SocketIO('localhost', 8000, LoggingNamespace) as socketIO:
    socketIO.emit('aaa')
    socketIO.wait(seconds=1)

Emit with callback. ::

from socketIO_client import SocketIO, LoggingNamespace

def on_bbb_response(*args):
    print('on_bbb_response', args)

with SocketIO('localhost', 8000, LoggingNamespace) as socketIO:
    socketIO.emit('bbb', {'xxx': 'yyy'}, on_bbb_response)
    socketIO.wait_for_callbacks(seconds=1)

Define events. ::

from socketIO_client import SocketIO, LoggingNamespace

def on_connect():
    print('connect')

def on_disconnect():
    print('disconnect')

def on_reconnect():
    print('reconnect')

def on_aaa_response(*args):
    print('on_aaa_response', args)

socketIO = SocketIO('localhost', 8000, LoggingNamespace)
socketIO.on('connect', on_connect)
socketIO.on('disconnect', on_disconnect)
socketIO.on('reconnect', on_reconnect)

# Listen
socketIO.on('aaa_response', on_aaa_response)
socketIO.emit('aaa')
socketIO.emit('aaa')
socketIO.wait(seconds=1)

# Stop listening
socketIO.off('aaa_response')
socketIO.emit('aaa')
socketIO.wait(seconds=1)

# Listen only once
socketIO.once('aaa_response', on_aaa_response)
socketIO.emit('aaa')  # Activate aaa_response
socketIO.emit('aaa')  # Ignore
socketIO.wait(seconds=1)

Define events in a namespace. ::

from socketIO_client import SocketIO, BaseNamespace

class Namespace(BaseNamespace):

    def on_aaa_response(self, *args):
        print('on_aaa_response', args)
        self.emit('bbb')

socketIO = SocketIO('localhost', 8000, Namespace)
socketIO.emit('aaa')
socketIO.wait(seconds=1)

Define standard events. ::

from socketIO_client import SocketIO, BaseNamespace

class Namespace(BaseNamespace):

    def on_connect(self):
        print('[Connected]')

    def on_reconnect(self):
        print('[Reconnected]')

    def on_disconnect(self):
        print('[Disconnected]')

socketIO = SocketIO('localhost', 8000, Namespace)
socketIO.wait(seconds=1)

Define different namespaces on a single socket. ::

from socketIO_client import SocketIO, BaseNamespace

class ChatNamespace(BaseNamespace):

    def on_aaa_response(self, *args):
        print('on_aaa_response', args)

class NewsNamespace(BaseNamespace):

    def on_aaa_response(self, *args):
        print('on_aaa_response', args)

socketIO = SocketIO('localhost', 8000)
chat_namespace = socketIO.define(ChatNamespace, '/chat')
news_namespace = socketIO.define(NewsNamespace, '/news')

chat_namespace.emit('aaa')
news_namespace.emit('aaa')
socketIO.wait(seconds=1)

Connect via SSL (https://github.com/invisibleroads/socketIO-client/issues/54). ::

from socketIO_client import SocketIO

# Skip server certificate verification
SocketIO('https://localhost', verify=False)
# Verify the server certificate
SocketIO('https://localhost', verify='server.crt')
# Verify the server certificate and encrypt using client certificate
socketIO = SocketIO('https://localhost', verify='server.crt', cert=(
    'client.crt', 'client.key'))

Specify params, headers, cookies, proxies thanks to the requests <http://python-requests.org>_ library. ::

from socketIO_client import SocketIO
from base64 import b64encode

SocketIO(
    localhost', 8000,
    params={'q': 'qqq'},
    headers={'Authorization': 'Basic ' + b64encode('username:password')},
    cookies={'a': 'aaa'},
    proxies={'https': 'https://proxy.example.com:8080'})

Wait forever. ::

from socketIO_client import SocketIO

socketIO = SocketIO('localhost', 8000)
socketIO.wait()

License

This software is available under the MIT License.

Credits

  • Guillermo Rauch <https://github.com/rauchg>_ wrote the socket.io specification <https://github.com/automattic/socket.io-protocol>_.
  • Hiroki Ohtani <https://github.com/liris>_ wrote websocket-client <https://github.com/liris/websocket-client>_.
  • rod <http://stackoverflow.com/users/370115/rod>_ wrote a prototype for a Python client to a socket.io server <http://stackoverflow.com/questions/6692908/formatting-messages-to-send-to-socket-io-node-js-server-from-python-client>_.
  • Alexandre Bourget <https://github.com/abourget>_ wrote gevent-socketio <https://github.com/abourget/gevent-socketio>_, which is a socket.io server written in Python.
  • Paul Kienzle <https://github.com/pkienzle>, Zac Lee <https://github.com/zratic>, Josh VanderLinden <https://github.com/codekoala>, Ian Fitzpatrick <https://github.com/ifitzpatrick>, Lucas Klein <https://github.com/lukasklein>, Rui Chicoria <https://github.com/rchicoria>, Travis Odom <https://github.com/burstaholic>, Patrick Huber <https://github.com/stackmagic>, Brad Campbell <https://github.com/bradjc>, Daniel <https://github.com/dabidan>, Sean Arietta <https://github.com/sarietta>, Sacha Stafyniak <https://github.com/stafyniaksacha> submitted code to expand support of the socket.io protocol.
  • Bernard Pratz <https://github.com/guyzmo>, Francis Bull <https://github.com/franbull> wrote prototypes to support xhr-polling and jsonp-polling.
  • Joe Palmer <https://github.com/softforge>_ sponsored development.
  • Eric Chen <https://github.com/taiyangc>, Denis Zinevich <https://github.com/dzinevich>, Thiago Hersan <https://github.com/thiagohersan>, Nayef Copty <https://github.com/nayefc>, Jörgen Karlsson <https://github.com/jorgen-k>, Branden Ghena <https://github.com/brghena>, Tim Landscheidt <https://github.com/scfc>, Matt Porritt <https://github.com/mattporritt>, Matt Dainty <https://github.com/bodgit>, Thomaz de Oliveira dos Reis <https://github.com/thor27>, Felix König <https://github.com/Felk>, George Wilson <https://github.com/wilsonge>, Andreas Strikos <https://github.com/astrikos>, Alessio Sergi <https://github.com/asergi> Claudio Yacarini <https://github.com/cyacarinic>, Khairi Hafsham <https://github.com/khairihafsham>, Robbie Clarken <https://github.com/RobbieClarken>_ suggested ways to make the connection more robust.
  • Merlijn van Deen <https://github.com/valhallasw>, Frederic Sureau <https://github.com/fredericsureau>, Marcus Cobden <https://github.com/leth>, Drew Hutchison <https://github.com/drewhutchison>, wuurrd <https://github.com/wuurrd>, Adam Kecer <https://github.com/amfg>, Alex Monk <https://github.com/Krenair>, Vishal P R <https://github.com/vishalwy>, John Vandenberg <https://github.com/jayvdb>, Thomas Grainger <https://github.com/graingert>, Daniel Quinn <https://github.com/danielquinn>, Adric Worley <https://github.com/AdricEpic>, Adam Roses Wight <https://github.com/adamwight>, Jan Včelák <https://github.com/fcelda> proposed changes that make the library more friendly and practical for you!

0.7

  • Fixed thread cleanup
  • Fixed disconnect detection if defined directly thanks to Andreas Strikos

0.6

  • Upgraded to socket.io protocol 1.x thanks to Sean Arietta and Joe Palmer
  • Fixed support for Python 3
  • Fixed SSL support
  • Added locks to fix concurrency issues with polling transport
  • Added SocketIO.off() and SocketIO.once()

0.5

  • Added support for Python 3
  • Added support for jsonp-polling thanks to Bernard Pratz
  • Added support for xhr-polling thanks to Francis Bull
  • Added support for query params and cookies
  • Fixed sending acknowledgments in custom namespaces thanks to Travis Odom
  • Rewrote library to use coroutines instead of threads to save memory

0.4

  • Added support for custom headers and proxies thanks to Rui and Sajal
  • Added support for server-side callbacks thanks to Zac Lee
  • Merged Channel functionality into BaseNamespace thanks to Alexandre Bourget

0.3

  • Added support for secure connections
  • Added SocketIO.wait()
  • Improved exception handling in _RhythmicThread and _ListenerThread

0.2

  • Added support for callbacks and channels thanks to Paul Kienzle
  • Incorporated suggestions from Josh VanderLinden and Ian Fitzpatrick

0.1

  • Wrapped code from StackOverflow <http://stackoverflow.com/questions/6692908/formatting-messages-to-send-to-socket-io-node-js-server-from-python-client>_
  • Added exception handling to destructor in case of connection failure