所有文章

使用rust创建websocket服务器

最近需要做实时推送相关的应用,所以继续调研了一下websocket,在15年底的时候曾经使用过 Gru 来做聊天推送, 但是那时候没仔细研究过websocket的细节。现在趁机自己构思一下

使用 ws-rs 构建websocket服务端

按照 Guide 搭建服务端应用,代码见下:

cargo new ws-server1 --bin
extern crate ws;

use ws::listen;

fn main() {
    listen("127.0.0.1:3012", |out| {
        move |msg| {
            println!("received msg: {}", msg);
            out.broadcast(msg)
        }
    }).unwrap()
}

cargo run 运行服务端

服务端推送

往socket里面推送消息,代码见下:

cargo new ws-client1 --bin
extern crate ws;

use ws::{connect, CloseCode};

fn main() {
    connect("ws://127.0.0.1:3012", |out| {
        out.send("Hello WebSocket").unwrap();

        move |msg| {
            println!("Got message: {}", msg);
            out.close(CloseCode::Normal)
        }
    }).unwrap()
}

运行 cargo run,这时候会看到服务端输出received msg: Hello WebSocket,客户端输出Got message: Hello WebSocket

客户端连接

创建2个websocket客户端连接,打开2个chrome标签,分别在终端执行

ws = new WebSocket('ws://127.0.0.1:3012'); // 创建连接
ws.addEventListener('message', function (event) {
    console.log('Message from server ', event.data);
}); // 监听服务端

ws.send('from browser'); // 可以在2个console中互相发消息玩

能发现websocket会自动检测连接,如果连接断开会提示 =WebSocket is already in CLOSING or CLOSED state.= 这也省去了手动发送心跳包 检测连接的麻烦