CLOVER🍀

That was when it all began.

Discard Serverに送られてきたデータを見てみる

前回作成したDiscard Serverを、クライアントから送られてきたデータを見れるように修正してみましょう。

って要は
http://netty.io/docs/stable/guide/html/#start.6
に沿って修正するだけなのですが。

つまり、こういう結果になります。修正するのは、DiscardServerHandlerクラスです。
DiscardServerHandler.scala

import org.jboss.netty.buffer.ChannelBuffer
import org.jboss.netty.channel.{ChannelHandlerContext, ExceptionEvent, MessageEvent, SimpleChannelHandler}

class DiscardServerHandler extends SimpleChannelHandler { // (1)
  override def messageReceived(ctx: ChannelHandlerContext, e: MessageEvent): Unit = { // (2)
    e.getMessage match {
      case buf: ChannelBuffer => // (9)
        printReceiveData()

        import scala.annotation.tailrec
        @tailrec
        def printReceiveData() {
          buf.readable match {
            case true =>
              println(buf.readByte().asInstanceOf[Char])
              Console.flush()
              printReceiveData()
            case _ =>
          }
        }
      case _ =>
    }
  }

  override def exceptionCaught(ctx: ChannelHandlerContext, e: ExceptionEvent): Unit = { // (3)
    e.getCause.printStackTrace()

    val ch = e.getChannel
    ch.close()
  }
}

修正したのは、ここだけ。

  override def messageReceived(ctx: ChannelHandlerContext, e: MessageEvent): Unit = { // (2)
    e.getMessage match {
      case buf: ChannelBuffer => // (9)
        printReceiveData()

        import scala.annotation.tailrec
        @tailrec
        def printReceiveData() {
          buf.readable match {
            case true =>
              println(buf.readByte().asInstanceOf[Char])
              Console.flush()
              printReceiveData()
            case _ =>
          }
        }
      case _ =>
    }
  }

例に習って、該当の節を読んでみます。


telnetコマンドを使えば、簡単にこのサーバをテストすることができます。でも、サーバが正しく動作しているかどうか、確認したいですよね?このサーバはレスポンスを返さないので、受け取ったデータをコンソールに出力するように修正してみましょう。

すでにデータを受信した時にはMessageEventが生成され、messageReceivedイベントハンドラメソッドが呼び出されることは知っていますね?では、DiscardServerHandlerクラスのmessageReceivedメソッドを修正してみましょう。

(9)
ソケットにより転送されたメッセージの型が、いつもChannelBufferインターフェースと見なすのは安全です。ChannelBufferインターフェースは、Nettyでバイトシーケンスを格納するための基本的なデータ構造です。ChannelBufferはNIOのByteBufferクラスによく似ていますが、より使いやすくて柔軟です。例えば、Nettyは不要なメモリコピーの回数を減らすような、多数のChannelBufferを組み合わせ、合成した(コンポジットな)ChannelBufferを作成することを許しています。

ChannelBufferはNIOのByteBufferにとてもよく似ているとはいえ、APIリファレンスを参照することを強くお勧めします。ChannelBufferを正しく理解することは、Nettyを自在に使うためのとても重要なステップです。


で、この状態で実行すると、こうなります。

> run
[info] Compiling 1 Scala source to /xxxxx/netty-discard/target/scala-2.9.1/classes...
[info] Running DiscardServer 

telnet実行。

$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello
World

sbtのコンソール側。

H
e
l
l
o



W
o
r
l
d