44 releases (6 stable)
| 1.1.0 | May 12, 2026 |
|---|---|
| 1.0.1 | Apr 22, 2026 |
| 1.0.0-pre.3 | Feb 17, 2026 |
| 1.0.0-pre.1 | Dec 20, 2025 |
| 0.2.0 | Jul 31, 2024 |
#13 in Network programming
22 downloads per month
42KB
665 lines
protosocket-server
Raw server scaffolding for protosocket connections.
This crate sits one layer below protosocket-rpc. Use it when you want direct control over
the MessageReactor for each connection — for example, when you need a custom message
ordering or streaming protocol that doesn't fit the request/response RPC pattern.
You can implement RESP or memcache, or just about any other message-oriented protocol with this low level of abstraction.
If you want unary or server-streaming RPC out of the box, use protosocket-rpc instead.
How it works
Implement ServerConnector to describe your codec and how to build a per-connection
MessageReactor. Then pass your connector to ProtosocketServerConfig to bind a listener
and get a server future you can spawn or await, depending on where you want the connection
to run:
use protosocket_server::{ServerConnector, ProtosocketServerConfig};
struct MyConnector;
impl ServerConnector for MyConnector {
type Codec = /* your Encoder + Decoder */;
type Reactor = /* your MessageReactor */;
type SocketListener = TcpSocketListener;
fn codec(&self) -> Self::Codec { /* ... */ }
fn new_reactor(
&self,
outbound: spillway::Sender</* LogicalOutbound */>,
stream: &StreamWithAddress<TcpStream>,
) -> Self::Reactor {
// Build your reactor, store the outbound sender to push replies
}
fn spawn_connection(&self, connection: Connection</* ... */>) {
tokio::spawn(connection);
}
}
let server = ProtosocketServerConfig::default()
.max_buffer_length(16 * 1024 * 1024)
.bind_tcp("0.0.0.0:8080".parse()?, MyConnector)?;
tokio::spawn(server);
Configuration
ProtosocketServerConfig controls buffer sizes per connection:
| Setting | Default | Description |
|---|---|---|
max_buffer_length |
32 MiB | Maximum receive buffer per connection |
max_queued_outbound_messages |
128 | Outbound message queue depth |
buffer_allocation_increment |
1 MiB | Grow the receive buffer in steps of this size |
ProtosocketSocketConfig controls TCP options (nodelay, reuseaddr/reuseport, keepalive, backlog).
The defaults enable nodelay and reuse with a backlog of 65536.
See example-telnet for the simplest full example.
Dependencies
~10–19MB
~327K SLoC