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つがあるみたい。
- ☆25 : ehsanul/rust-ws
- ☆3 : cyderize/rust-websocket
- ☆6 : nathansizemore/rustic-io
- ☆0 : jaredwy/socket.rust
- ☆0 : kstep/rust-websocket
時間もないので一つだけ試してみます。
簡単なChatを作る(ただechoしてるだけ)
動かしてみた感じ↓
サーバ側
ブラウザ側
コード(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 さんです。