Skip to content

P40b0s/websocket_service

Repository files navigation

Клиент-сервер websocket с общим типом сообщений

Клиент или сервер необходимо запускать в рантайме tokio
При использовании future json или flexbuffers необходимо создать enum с перечнем сообщений

#[derive(serde::Serialize, serde::Deserialize, Debug)]
pub enum TransportMessage
{
    Test1(TestPayload),
    Test2(String)
}

При использовании future binary

#[derive(bitcode::Encode, bitcode::Decode, Debug)]
pub enum TransportMessage
{
    Test1(TestPayload),
    Test2(String)
}

Для сообщений необходимо реализовать трейт Converter

impl Converter for TransportMessage{}

Вот пример его реализации для future json (для всех футур он уже реализован надо его только имплементировать на свой enum)

pub trait Converter where Self: serde::Serialize, for <'de> Self : serde::Deserialize<'de> + Sized + Debug + Send
{
    fn from_binary(slice: &[u8]) -> Result<Self>
    {
        let obj = serde_json::from_slice::<Self>(slice).with_context(|| format!("Данный объект отличается от того который вы хотите получить"))?;
        return Ok(obj);
    }
    fn to_binary(self) -> Vec<u8>
    {
        let mut bytes: Vec<u8> = Vec::new();
        let _ = serde_json::to_writer(&mut bytes, &self);
        bytes
    }
}

Клиент

Необходимо создать структуру и имплементировать для нее Client

static CLIENT_ID: Lazy<String> = Lazy::new(|| {
    let ts = Timestamp::from_unix(NoContext, 1497624119, 1234);
    let uuid = Uuid::new_v7(ts);
    uuid.to_string()
});
pub struct Client1;
impl Client<TransportMessage> for Client1
{
    fn get_id() -> &'static str 
    {
        &CLIENT_ID
    }
}
 

и можно запускать своего клиента так

Client1::start_client("ws://127.0.0.1:3010/", |msg: TransportMessage|
{
    //обработка поступившего сообщения
    
}).await;

или так:

Client1::start_client("ws://127.0.0.1:3010/", on_client_receive).await;
fn on_client_receive(msg: TransportMessage)
{
   //обработка поступившего сообщения
}

Сервер

Необходимо создать структуру и имплементировать для нее Server

pub struct WsServer;
impl Server<TransportMessage> for WsServer{}

и можно запускать свой сервер так:

//addr - адрес от которого пришло сообщение
WsServer::start_server("127.0.0.1:3010", |addr, msg|
{
    async move
    {
        //обработка сообщения
    }
}).await;

или так:

WsServer::start_server("127.0.0.1:3010", on_server_receive).await;
async fn on_server_receive(addr: SocketAddr, msg: TransportMessage)
{
    //обработка сообщения
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages