1

私は Rust を学んでおり、websocket サーバーを作成しようとしています。ロジックは次のとおりです。WSConnectionFactory は、着信メッセージを処理し、任意のルールに従って他のクライアントに送信する WSHandler を作成します。問題は、そのような動作を実装する方法がわからないことです。

制限: Factory および Handler トレイトのシグネチャは、 ws-rsライブラリによって提供されるため、変更できません。

質問: RefCell/Cell を使用してこれを実装するにはどうすればよいですか?

extern crate rand;
extern crate rustc_serialize;
extern crate ws;
#[macro_use]
extern crate log;
#[macro_use]
extern crate env_logger;

use std::cell::RefCell;
use std::collections::HashMap;
use rand::random;
use ws::{Factory, Sender, Handler, Handshake, Message, CloseCode, WebSocket};
use ws::Result as WSResult;
use ws::util::Token;

struct WSConnectionFactory<'p> {
    handlers: HashMap<&'p u32, RefCell<&'p WSHandler<'p>>>,
}

#[derive(Debug)]
struct WSHandler<'h> {
    uid: &'h u32,
    ws: RefCell<&'h Sender>,
}

impl<'p> Factory for WSConnectionFactory<'p> {
    type Handler = WSHandler<'p>;

    fn connection_made(&mut self, ws: Sender) -> Self::Handler {
        println!("factory.connection_made token={:?}", &ws.token());
        let uid = &random::<u32>();
        let handler = WSHandler {
            uid: uid,
            ws: RefCell::new(&ws),
        };
        self.handlers.insert(uid, RefCell::new(&handler));
        handler
    }
}

impl<'h> Handler for WSHandler<'h> {
    fn on_open(&mut self, _handshake: Handshake) -> WSResult<()> {
        println!("handler.on_open");
        Ok(())
    }
    fn on_message(&mut self, msg: Message) -> WSResult<()> {
        println!("handler.on_message {:?}", msg);
        Ok(())
    }
    fn on_timeout(&mut self, _token: Token) -> WSResult<()> {
        println!("handler.on_timeout {:?}", _token);
        Ok(())
    }
    fn on_close(&mut self, code: CloseCode, reason: &str) {
        println!("handler.on_close code={:?}, reason={:?}", code, reason);
    }
}

fn main() {
    let factory = WSConnectionFactory { handlers: HashMap::new() };
    let ws_socket = WebSocket::new(factory).expect("Can't create WebSocket");
    ws_socket.listen("127.0.0.1:8080").expect("Can't bind to socket");
}
4

1 に答える 1