Skip to content

Instantly share code, notes, and snippets.

@nisei
Last active December 24, 2019 01:54
Show Gist options
  • Select an option

  • Save nisei/0f1d24c6bb04b71e5b04890d6bb89d5e to your computer and use it in GitHub Desktop.

Select an option

Save nisei/0f1d24c6bb04b71e5b04890d6bb89d5e to your computer and use it in GitHub Desktop.
websocket for rust
extern crate ws;
extern crate env_logger;
use chrono::{Local, DateTime};
use ws::{listen, CloseCode, Sender, Handler, Handshake, Message, Result};
fn main() {
// ロガーの初期化
env_logger::init();
// WebSocketの開始
listen("127.0.0.1:3012", |out| {
Server {
out: out,
user_name: String::new()
}
}).unwrap();
struct Server {
out: Sender,
user_name: String
}
impl Handler for Server {
// WebSocketとのコネクション接続を開始した場合
fn on_open(&mut self, handshake: Handshake) -> Result<()> {
let hashed_key: String = handshake.request.hashed_key().unwrap();
let headers: &Vec<(String, Vec<u8>)> = handshake.request.headers();
// ヘッダーで送信されてきたユーザ名を取得する
for (k, v) in headers {
if k == "User-Name" {
self.user_name = String::from_utf8(v.to_vec()).unwrap();
}
}
// ログイン情報を接続している全てのクライアントに配信する
println!("[{}] {} Connected. hash_key: {}", str_datetime(), self.user_name, hashed_key);
let send_message: String = format!("[{}] {} Join the Chat Room.", str_datetime(), self.user_name);
return self.out.broadcast(send_message);
}
// メッセージを受信した場合
fn on_message(&mut self, message: Message) -> Result<()> {
// 受信したメッセージを接続している全てのクライアントに配信する
let send_message: String = format!("[{}] {}: {}", str_datetime(), self.user_name, message);
println!("{}", send_message);
return self.out.broadcast(send_message);
}
// WebSocketとのコネクション接続が閉じた場合
fn on_close(&mut self, code: CloseCode, reason: &str) {
// ログイン情報を接続している全てのクライアントに配信する
println!("[{}] {} Disconnected for ({:?}) {}", str_datetime(), self.user_name, code, reason);
let send_message: String = format!("[{}] {} Left the Chat Room.", str_datetime(),self.user_name);
let _ = self.out.broadcast(send_message);
}
}
// 日付の文字列を取得
fn str_datetime() -> String {
// メッセージに日付を付与
let local_datetime: DateTime<Local> = Local::now();
let formatted_local_datetime: String = local_datetime.format("%Y-%m-%d %T").to_string();
return formatted_local_datetime;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment