All Projects → lemunozm → Message Io

lemunozm / Message Io

Licence: apache-2.0
Event-driven message library for building network applications easy and fast.

Programming Languages

rust
11053 projects

Projects that are alternatives of or similar to Message Io

Simplenet
An easy-to-use, event-driven, asynchronous network application framework compiled with Java 11.
Stars: ✭ 164 (-48.91%)
Mutual labels:  asynchronous, network, tcp, tcp-server
Workerman
An asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols. PHP>=5.3.
Stars: ✭ 9,617 (+2895.95%)
Mutual labels:  asynchronous, event-driven, websocket, tcp
XAsyncSockets
XAsyncSockets is an efficient Python/MicroPython library of managed asynchronous sockets.
Stars: ✭ 28 (-91.28%)
Mutual labels:  tcp, sockets, asynchronous, udp
twjitm-core
采用Netty信息加载实现长连接实时通讯系统,客户端可以值任何场景,支持实时http通讯、webSocket通讯、tcp协议通讯、和udp协议通讯、广播协议等 通过http协议,rpc协议。 采用自定义网络数据包结构, 实现自定义网络栈。
Stars: ✭ 98 (-69.47%)
Mutual labels:  tcp, asynchronous, udp, tcp-server
ctsTraffic
ctsTraffic is a highly scalable client/server networking tool giving detailed performance and reliability analytics
Stars: ✭ 125 (-61.06%)
Mutual labels:  tcp, sockets, udp, tcp-server
Socketify
Raw TCP and UDP Sockets API on Desktop Browsers
Stars: ✭ 67 (-79.13%)
Mutual labels:  tcp, sockets, udp, tcp-server
Socket-Programming-With-C
✉️ Learn Network Protocol and Network Programming
Stars: ✭ 147 (-54.21%)
Mutual labels:  udp, tcp-server, network-programming
protocol
Easy protocol definitions in Rust
Stars: ✭ 151 (-52.96%)
Mutual labels:  tcp, udp, network-programming
Laravel S
LaravelS is an out-of-the-box adapter between Swoole and Laravel/Lumen.
Stars: ✭ 3,479 (+983.8%)
Mutual labels:  websocket, tcp, udp
workerman
An asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols. PHP>=5.4.
Stars: ✭ 10,005 (+3016.82%)
Mutual labels:  tcp, asynchronous, event-driven
Toast Haste.framework
TOAST Haste framework is a pure java implementation of asynchronous game server framework
Stars: ✭ 95 (-70.4%)
Mutual labels:  asynchronous, event-driven, udp
network
exomia/network is a wrapper library around System.Socket for easy and fast TCP/UDP client & server communication.
Stars: ✭ 18 (-94.39%)
Mutual labels:  tcp, udp, tcp-server
asyncio-socks-server
A SOCKS proxy server implemented with the powerful python cooperative concurrency framework asyncio.
Stars: ✭ 154 (-52.02%)
Mutual labels:  tcp, asynchronous, udp
Firefly
Firefly is an asynchronous web framework for rapid development of high-performance web application.
Stars: ✭ 277 (-13.71%)
Mutual labels:  asynchronous, websocket, tcp
Ws Machine
WS-Machine is a websocket finite state machine for client websocket connections (Go)
Stars: ✭ 110 (-65.73%)
Mutual labels:  asynchronous, non-blocking, websocket
Computer Networking A Top Down Approach Notes
《计算机网络-自顶向下方法(原书第6版)》编程作业,Wireshark实验文档的翻译和解答。
Stars: ✭ 3,890 (+1111.84%)
Mutual labels:  network, tcp, udp
Collie
An asynchronous event-driven network framework( port netty ) written in D.
Stars: ✭ 60 (-81.31%)
Mutual labels:  asynchronous, event-driven, network
Hprose Nodejs
Hprose is a cross-language RPC. This project is Hprose 2.0 for Node.js
Stars: ✭ 297 (-7.48%)
Mutual labels:  websocket, tcp, tcp-server
Simps
🚀 A simple, lightweight and high-performance PHP coroutine framework.
Stars: ✭ 318 (-0.93%)
Mutual labels:  websocket, tcp, udp
packet
📦 Send network packets over a TCP or UDP connection.
Stars: ✭ 68 (-78.82%)
Mutual labels:  tcp, udp, network-programming

message-io

message-io is an event-driven message library to build network applications easy and fast. The library handles the internal OS socket in order to offer a simple event message API to the user. It also allows you to make an adapter for your own transport protocol following some rules, delegating to the library the tedious asynchrony and thread management.

If you find a problem using the library or you have an improvement idea, do not hesitate to open an issue. Any contribution is welcome!

Motivation

Managing sockets is hard because you need to fight with threads, concurrency, IO errors that come from the OS (which are really difficult to understand in some situations), encoding... And if you make use of non-blocking sockets, it adds a new layer of complexity: synchronize the events that come asynchronously from the OS poll.

message-io offers an easy way to deal with all these mentioned problems, making them transparently for you, the programmer that wants to make an application with its own problems. For that, message-io offers a simple API and give only two concepts to understand: messages (the data you send and receive), and endpoints (the recipients of that data). This abstraction also offers the possibility to use the same API independently of the transport protocol used. You could change the transport of your application in literally one line.

Features

  • Highly scalable: non-blocking sockets that allows to manage thousands of active connections.
  • Multiplatform: see mio platform support.
  • Multiples transports (docs):
    • TCP: native and framed version
    • UDP, with multicast option
    • WebSocket: basic and secure option using tungstenite-rs.
  • Customizable: message-io doesn't have the transport you need? Add easily and adapter.
  • FIFO events with timers and priority.
  • Easy, intuitive and consistent API:
    • Follows KISS principle.
    • Abstraction from transport layer: do not think about sockets, think about messages and endpoints.
    • Only two main entities to use:
      • an extensible Eventqueue to manage all events synchronously,
      • a Network to manage all connections (connect, listen, remove, send, receive).
    • Forget concurrence problems: handle all connection and listeners from one thread: "One thread to rule them all".
    • Easy error handling: do not deal with dark internal std::io::Error when send/receive from the network.
  • High performance:
    • Using non-blocking sockets from one thread allows to not waste memory and time synchonizing multiple threads.
    • Full duplex: simultaneous reading/writing operations over same internal OS sockets.

Getting started

Add to your Cargo.toml (all the transports included by default):

message-io = "0.11"

If you only want to use a subset of the available transport battery, you can select them by their associated features tcp, udp, and websocket. For example, in order to include only TCP and UDP, add to your Cargo.toml:

message-io = { version = "0.11", default-features = false, features = ["tcp", "udp"] }

Warning: If you comming from 0.9.4 o less, note that Transport::Tcp has been renamed to Transport::FramedTcp to be more according to its behaviour. See more here.

Documentation

All in one: TCP, UDP and WebSocket echo server

The following example is the simplest server that reads messages from the clients and responds to them. It is capable to manage several client connections and listen from 3 differents protocols at the same time.

use message_io::network::{Network, NetEvent, Transport};

fn main() {
    // Create a Network with an associated event queue for reading its events.
    let (mut network, mut events) = Network::split();

    // Listen for TCP, UDP and WebSocket messages.
    network.listen(Transport::FramedTcp, "0.0.0.0:3042").unwrap(); // Tcp encoded for packets
    network.listen(Transport::Udp, "0.0.0.0:3043").unwrap();
    network.listen(Transport::Ws, "0.0.0.0:3044").unwrap();

    loop {
        match events.receive() { // Read the next event or wait until have it.
            NetEvent::Message(endpoint, data) => {
                println!("Received: {}", String::from_utf8_lossy(&data));
                network.send(endpoint, &data);
            },
            NetEvent::Connected(_endpoint, _) => println!("Client connected"), // Tcp or Ws
            NetEvent::Disconnected(_endpoint) => println!("Client disconnected"), //Tcp or Ws
        }
    }
}

Echo client

The following example shows a client that can connect to the previous server. It sends a message each second to the server and listen its echo response. Changing the Transport::FramedTcp to Udp or Ws will change the underlying transport used. Also, you can create the number of connections you want at the same time, without any extra thread.

use message_io::network::{Network, NetEvent, Transport};

enum Event {
    Net(NetEvent),
    Tick,
    // Any other app event here.
}

fn main() {
    // The split_and_map() version allows to combine network events with your application events.
    let (mut network, mut events) = Network::split_and_map(|net_event| Event::Net(net_event));

    // You can change the transport to Udp or Ws (WebSocket).
    let (server, _) = network.connect(Transport::FramedTcp, "127.0.0.1:3042").unwrap();

    events.sender().send(Event::Tick); // Start sending
    loop {
        match events.receive() {
            Event::Net(net_event) => match net_event { // event from the network
                NetEvent::Message(_endpoint, data) => {
                    println!("Received: {}", String::from_utf8_lossy(&data));
                },
                _ => (),
            }
            Event::Tick => { // computed every second
                network.send(server, "Hello server!".as_bytes());
                events.sender().send_with_timer(Event::Tick, std::time::Duration::from_secs(1));
            }
        }
    }
}

Test it yourself!

Clone the repository and test the Ping Pong example (similar to the echo example but more vitaminized).

Run the server:

cargo run --example ping-pong server tcp 3456

Run the client:

cargo run --example ping-pong client tcp 127.0.0.1:3456

You can play with it changing the transport, running several clients, disconnect them, etc. See more here.

Do you need a transport protocol that message-io doesn't have? Add an adapter!

message-io offers two kinds of APIs. The user API, that talks to message-io itself as an user that want to use the library, and the internal adapter API for those who want to add their protocol adapters into the library.

If a transport protocol can be built in top of mio (most of the existing protocol libraries can), then you can add it to message-io really easy:

  1. Add your adapter file in src/adapters/<my-transport-protocol>.rs that implements the traits that you find here. It contains only 7 mandatory functions to implement (see the template), and take little more than 150 lines to implement an adapter file.

  2. Add a new field in the Transport enum found in src/transport.rs to register your new adapter.

That's all. You can use your new transport with the message-io API like any other.

Oops! one step more, make a Pull request so everyone can use it :)

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].