40
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TIS EngineerAdvent Calendar 2015

Day 14

【ChatDeTornado】TornadoでWebSocketを使ってチャットを作る

Posted at

はじめに

今回はPython製のWebサーバ&WebフレームワークであるTornadoを使ってチャットを作ってみます。Tornadoを使う理由は、デフォルトでWebSocketに対応しているため、リアルタイムのサービスを作りやすいからです。

使うもの

使うものは以下の2つです。

  • Tornado
  • jquery.ui.chatbox

サーバサイドにTornado、クライアントサイドにjquery.ui.chatboxを使います。jquery.ui.chatboxを使うと比較的楽にチャットを作れます。

コード

サーバサイドでメインの処理をしているのは以下のコード。waitersとmessagesに接続している人と送られてきたメッセージを記録しています。

class ChatHandler(tornado.websocket.WebSocketHandler):

    waiters = set()
    logs = []

    def open(self, *args, **kwargs):
        self.waiters.add(self)
        self.write_message({'logs': self.logs})

    def on_message(self, message):
        message = json.loads(message)
        self.logs.append(message)
        for waiter in self.waiters:
            if waiter == self:
                continue
            waiter.write_message({'img_path': message['img_path'], 'message': message['message']})

    def on_close(self):
        self.waiters.remove(self)

openメソッドでは接続してきた人の登録と、その人に対して今までのログを送信します。

on_messageメソッドでは、メッセージが送られてきたときに送られてきたメッセージを自分以外の参加者にブロードキャストします。また、このとき送られてきたメッセージはログに追加しておきます。

on_closeメソッドでは、接続が切断されたときにwaitersから接続者を削除します。これにより、切断された人にはメッセージをブロードキャストしないようにしています。

完成品

以下が完成品です。1時間くらいで作ったやっつけですが、ちゃんと動きます。上部のバーをクリックすることで、チャット画面の開閉を行えるのが特徴です。
スクリーンショット 2015-12-14 0.17.43.png

サンプルコード

サンプルコードは以下のリンクからどうぞ。

おわりに

今回はTornadoを使ってチャットアプリを作ってみました。Pythonでちょっとしたリアルタイムのアプリケーションを作成したい場合はTornadoを使うといいと思います。

40
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?