単なるメモ
Swift-NIO の ChannelInboundHandler
/ChannelOutboundHandler
を記述する際のポイント
ChannelInboundHandler
- Netty の
ChannelInboundHandler
と同じく、基本的にはchannelRead(ctx:ChannelHandlerContext, data: NIOAny)
を実装する NIOAny
型は Netty でのObject
とに該当するが、それらの型はassociatedtype
のInboundIn
に型変換をおこなう- 変換は
unwrapInboundIn(_: NIOAny) -> InboundIn
にておこなう
- 変換は
associatedtype
で関連される型は次のものがあるInboundIn
:channelRead
で渡される型InboundOut
: 次のChannelInboundHandler
に渡す型OutboundOut
:ChannelHandlerContext
に書き込む型(書き込む場合に必要)
ChannelHandlerContext
に値を渡す場合は次のように行うfireChannelRead
に値を渡す場合はNIOAny
を渡す. その際はwrapInboundOut(_: InboundOut) -> NIOAny
にて変換するwrite(_: NIOAny, promise: EventLoopPromise<Void>?)
に値を渡す場合はNIOAny
で渡す. その際wrapOutboundOut(_: OutboundOut) -> NIOAny
にて変換する.
ChannelOutboundHandler
- Netty の
ChannelOutboundHandler
と同じくwrite(ctx: ChannelHandlerContext, data: NIOAny, promise: EventLoopPromise<Void>?)
を実装する data: NIOAny
はassociatedtype OutboundIn
にて型を指定することで型変換をおこなうunwrapOutboundIn(_: NIOAny) -> OutboundIn
で変換する
例
class EchoInboundHandler: ChannelInboundHandler { typealias InboundIn = ByteBuffer typealias OutboundOut = String func channelRead(ctx: ChannelHandlerContext, data: NIOAny) { var buffer = unwrapInboundIn(data) let message = buffer.readString(length: buffer.readableBytes) print("message: \(message)") ctx.write(wrapOutboundOut(message), promise: nil) } } class EchoOutboundHandler: ChannelOutboundHandler { typealias OutboundIn = String typealias OutboundOut = ByteBuffer func write(ctx: ChannelHandlerContext, data: NIOAny, promise: EventLoopPromise<Void>?) { let message = unwrapOutboundIn(data) var buffer = ByteBufferAllocator().buffer(message.utf8.count) buffer.write(string: message) ctx.writeAndFlush(wrapOutboundOut(buffer), proise: nil).whenComplete({ ctx.close() }) } }
これを書き終えてから、公式のドキュメントがあることに気がついた…(´・ω・`)