#actix-web #socket-io #socketio-server

actix-web-socket-io

Pactix-web-socket-io server side

3 releases

new 0.1.3 Mar 28, 2025
0.1.2 Mar 28, 2025
0.1.1 Mar 28, 2025

#135 in WebSocket

BSD-3-Clause OR MIT OR Apache-2.0

24KB
459 lines

actix-web 的 socket.IO 的服务端实现

基于 Socket.IO Protocol V5Engine.IO Protocol V4 协议实现

目前只实现了 JSON 的请求与响应,Binary 的请求与响应不常用,暂没实现。

示例:

#[get("/socket.io")]
async fn listen_system(req: HttpRequest, stream: Payload) -> impl Responder {
    // 创建 socket 连接
    let SocketIOResult {
        http_response,
        session_receive,
        session_id,
    } = socket::socket_io().connect(&req, stream, SocketAuth);

    // 订阅建立连接
    session_receive
        .on(Listener {
            event_name: "connect".into(),
            handler: Box::new(SocketConnected),
        })
        .await;

    // 订阅断开连接
    session_receive
        .on(Listener {
            event_name: "disconnect".into(),
            handler: Box::new(SocketDisConnected),
        })
        .await;

    // 主动推送 任务一
    actix_web::rt::spawn(async move {
        let socket_server = socket::get_server();

        loop {
            // 每 1000ms 刷出一次数据
            actix_web::rt::time::sleep(Duration::from_millis(1000)).await;

            // 刷出系统时间
            if let Err(msg) = socket_server
                .emit(
                    Emiter {
                        event_name: "/system/timestamp".into(),
                        data: Utc::now().timestamp_millis(),
                    },
                    Some(session_id),
                )
                .await
            {
                log::error!("系统的时间刷出失败, msg: {}", msg);
            }
        }
    });
    http_response
}

pub struct SocketConnected;
#[async_trait]
impl MessageHandle for SocketConnected {
    async fn handler(&self, _: serde_json::Value, session_id: Uuid) {
        log::info!("有客户端建立连接成功,session_id={session_id}");
        // 做一些初始化任务
    }
}
pub struct SocketDisConnected;
#[async_trait]
impl MessageHandle for SocketDisConnected {
    async fn handler(&self, _: serde_json::Value, session_id: Uuid) {
        log::info!("有客户端断开连接成功,session_id={session_id}");
        // 做一些资源回收任务
    }
}

/// 注册 API 接口到 /system 路径下      
pub fn add_route() -> Scope {
    web::scope("/system").service(listen_system)
}

License

actix-web-socket-io may be used under your choice of the BSD 3-clause, Apache 2, or MIT license.

Dependencies

~16–27MB
~464K SLoC