mike-neckのブログ

JavaかJavaFXかJavaEE(なんかJava8が多め)

Swift-NIO の ChannelInboundHandler/ChannelOutboundHandler のメモ

単なるメモ

f:id:mike_neck:20180529230134p:plain

Swift-NIOChannelInboundHandler/ChannelOutboundHandler を記述する際のポイント

ChannelInboundHandler

  • Netty の ChannelInboundHandler と同じく、基本的には channelRead(ctx:ChannelHandlerContext, data: NIOAny) を実装する
  • NIOAny 型は Netty での Object とに該当するが、それらの型は associatedtypeInboundIn に型変換をおこなう
    • 変換は 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: NIOAnyassociatedtype 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() })
  }
}

これを書き終えてから、公式のドキュメントがあることに気がついた…(´・ω・`)

NIO Reference