RustでWebsocket

これは Rust Language Advent Calendar 2014 の第12日目となります。

RustでWebsocketで遊ぶ話です(遊ぶだけです)

Rustの環境を作る

まず、Rustは時間がなかったので rust playpen でしか遊んだことなかったので環境を作ります。

$ curl -s https://static.rust-lang.org/rustup.sh | sudo sh

MacとLinuxであればこのコマンドでインストール。Cargoも一緒にインストールされる(便利)

そして、vimrcに

NeoBundle 'wting/rust.vim'

を追記して、:NeoBundleInstallします。

RustでWebsocketするには

“rust websocket”でGoogle, GitHubで検索すると、2014.12.12現在以下の5つがあるみたい。

時間もないので一つだけ試してみます。

ehsanul/rust-ws

簡単なChatを作る(ただechoしてるだけ)

動かしてみた感じ↓

サーバ側

../../../_images/a564cf7a5b1cbfb762abe92ab7d4622e.png

ブラウザ側

../../../_images/42f132f971f948b85e65d6a5f1967f60.png

コード(Server)

extern crate time;
extern crate http;
extern crate ws;

use http::server::{Config, Server, Request, ResponseWriter};
use std::io::net::ip::{SocketAddr, Ipv4Addr};
use http::headers::content_type::MediaType;

use ws::server::WebSocketServer;
use ws::message::{Message, TextOp, Text, BinaryOp, Binary};

#[deriving(Clone)]
struct EchoServer;

impl Server for EchoServer {
    fn get_config(&self) -> Config {
        Config { bind_address: SocketAddr { ip: Ipv4Addr(127, 0, 0, 1), port: 8000 } }
    }

    fn handle_request(&self, r: Request, w: &mut ResponseWriter) {
        w.write(b"<h1>rust-ws chat sample</h1>").unwrap();
    }
}

impl WebSocketServer for EchoServer {
    fn handle_ws_connect(&self, receiver: Receiver<Box<Message>>, sender: Sender<Box<Message>>) {
        spawn(proc() {
            loop {
                let message = receiver.recv();

                let (payload, opcode) = match message.payload {
                    Text(p)   => (Text(p), TextOp),
                    Binary(p) => (Binary(p), BinaryOp),
                    _         => unimplemented!(),
                };
                let echo_message = box Message {
                    payload: payload,
                    opcode: opcode,
                };
                println!("{}", echo_message);
                sender.send(echo_message);
            }
        });
    }
}

fn main() {
    EchoServer.ws_serve_forever();
}

さいごに

とりあえず、rust-wsだけですが、ほかも試そうとしたりしました。(が、エラー出たりして動かなかったのもある)

Clientもほしかったのですが、実装されていたrust-websocketは、サンプルがうまく動かなかった。。rust-wsもClient実装予定なので期待。

(というか、自分で実装したほうがためになりそう。。時間があれば、、)

まとめると、Rust関連ツールは今まさに開発中でおもしろさあるということです。

明日の担当予定は、 @rail44 さんです。