ServerBootstrap
A ServerBootstrap
is an easy way to bootstrap a ServerSocketChannel
when creating network servers.
final class ServerBootstrap
Example:
let group = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount)
defer {
try! group.syncShutdownGracefully()
}
let bootstrap = ServerBootstrap(group: group)
// Specify backlog and enable SO_REUSEADDR for the server itself
.serverChannelOption(.backlog, value: 256)
.serverChannelOption(.socketOption(.so_reuseaddr), value: 1)
// Set the handlers that are applied to the accepted child `Channel`s.
.childChannelInitializer { channel in
// Ensure we don't read faster then we can write by adding the BackPressureHandler into the pipeline.
channel.pipeline.addHandler(BackPressureHandler()).flatMap { () in
// make sure to instantiate your `ChannelHandlers` inside of
// the closure as it will be invoked once per connection.
channel.pipeline.addHandler(MyChannelHandler())
}
}
// Enable SO_REUSEADDR for the accepted Channels
.childChannelOption(.socketOption(.so_reuseaddr), value: 1)
.childChannelOption(.maxMessagesPerRead, value: 16)
.childChannelOption(.recvAllocator, value: AdaptiveRecvByteBufferAllocator())
let channel = try! bootstrap.bind(host: host, port: port).wait()
/* the server will now be accepting connections */
try! channel.closeFuture.wait() // wait forever as we never close the Channel
The EventLoopFuture
returned by bind
will fire with a ServerSocketChannel
. This is the channel that owns the listening socket. Each time it accepts a new connection it will fire a SocketChannel
through the ChannelPipeline
via fireChannelRead
: as a result, the ServerSocketChannel
operates on Channel
s as inbound messages. Outbound messages are not supported on a ServerSocketChannel
which means that each write attempt will fail.
Accepted SocketChannel
s operate on ByteBuffer
as inbound data, and IOData
as outbound data.