Ubuntu14.04 Python 2.7.6 でWebsocket実装

モジュールのインストール

sudo apt-get install libevent-dev python-dev python-setuptools
sudo easy_install gevent
sudo easy_install gevent-websocket

サーバスクリプト作成

vi chat.py

#! /usr/bin/python
# -*- coding: utf-8 -*-

import os
import random
from geventwebsocket.handler import WebSocketHandler
from gevent import pywsgi, sleep

ws_list = set()

def chat_handle(environ, start_response):
    global cnt
    ws = environ['wsgi.websocket']
    ws_list.add(ws)a
    print 'enter!', len(ws_list)
    while 1:
        msg = ws.receive()
        if msg is None:
            break
        remove = set()
        for s in ws_list:
            try:
                s.send(msg)
            except Exception:
                remove.add(s)
        for s in remove:
            ws_list.remove(s)
    print 'exit!', len(ws_list)

def myapp(environ, start_response):  
    path = environ["PATH_INFO"]
    print path
    if path == "/": 
        start_response("200 OK", [("Content-Type", "text/html")])  
        return open('./chat_sample.html').read()
    elif path == "/chat":  
        return chat_handle(environ, start_response)
    raise Exception('Not found.')

server = pywsgi.WSGIServer(('0.0.0.0', 8080), myapp, handler_class=WebSocketHandler)

server.serve_forever()

クライアント側 HTML作成

vi chat_sample.html

<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>
$(function() {
    var data = {};
    ws = new WebSocket("ws://127.0.0.1:8080/chat");
    ws.onopen = function() {
        ws.send('hi');
    };
    ws.onmessage = function(e) {
      $("#holder").append($('<p>'+e.data+'</p>'));
    };
    $('#sender').append($('<button/>').text('send').click(function(){
        ws.send($('#message').val());
    }));
});
</script>
</head>
<body>
<div id="sender">
<input type="text" id="message" value="text" />
</div>
<h3>Messages</h3>
<div id="holder"></div>
</body>
</html>

モジュール実行

python chat.py

確認

http://localhost:8080へアクセス

以下ではない

python -m SimpleHTTPServer 8080
python -m CGIHTTPServer 8080