message-io license downloads

message-io

message-io is an asynchronous network message library for building clients and servers. This library offers an event-based API over an abstraction network transport layer.

This library can be used but it is still growing, so if you see any bug or strange behaviour, please put an issue! Of course, any contribution is welcome!

For who is this project?

Features

Getting started

Add to your Cargo.toml message-io = "0.1"

Documentation

Example

The following example is simplest server that reads HelloServer message and responses with a HelloClient message. It is capable to manage several client connections and listen from 2 differents ports and interfaces.

```rust use messageio::eventqueue::{EventQueue}; use messageio::networkmanager::{NetworkManager, NetEvent, TransportProtocol}; use serde::{Serialize, Deserialize};

[derive(Serialize, Deserialize)]

enum Message { HelloServer, HelloClient, // Other messages here }

enum Event { Network(NetEvent), // Other user events here }

fn main() { let mut event_queue = EventQueue::new();

// Create NetworkManager, the callback will push the network event into the event queue
let network_sender = event_queue.sender().clone();
let mut network = NetworkManager::new(move |net_event| network_sender.send(Event::Network(net_event)));

// Listen TCP messages at ports 3001 and 3002.
network.listen("127.0.0.1:3001".parse().unwrap(), TransportProtocol::Tcp).unwrap();
network.listen("0.0.0.0.0:3002".parse().unwrap(), TransportProtocol::Tcp).unwrap();

loop {
    match event_queue.receive() { // Read the next event or wait until have it.
        Event::Network(net_event) => match net_event {
            NetEvent::Message(message, endpoint) => match message {
                Message::HelloServer => network.send(endpoint, Message::HelloClient).unwrap(),
                _ => (), // Other messages here
            },
            NetEvent::AddedEndpoint(_endpoint) => println!("Client connected"),
            NetEvent::RemovedEndpoint(_endpoint) => println!("Client disconnected"),
        },
        // Other events here
    }
}

} ```

Basic concepts

The library has two main pieces:

To manage the connections the NetworkManager offers an Endpoint that is an unique identifier of the connection that can be used to remove, send or identify input messages.

The power comes when both pieces joins together, allowing to process all actions from one thread. To reach this, the user have to connect the NetworkManager to the EventQueue sending NetEvent produced by the first one.

Test yourself!

Clone the repository and test the basicexample that you can found in examples/basic:

Run the server: cargo run --example basic server [tcp/udp] In other terminals, run one or more clients: cargo run --example basic client [tcp/udp] (By default, if no protocol is specified, tcp is used)