CLOVER🍀

That was when it all began.

Discard ServerからEcho Serverへ

今度は、Discard ServerをEcho Serverに変更してみます。

はい、これを写します。
http://netty.io/docs/stable/guide/html/#start.7

結果は、こうなります。名前が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)
    val ch = e.getChannel // (10)
    ch.write(e.getMessage)

    /*
    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()
  }
}

messageReceivedメソッドが、こうなっただけですね。

  override def messageReceived(ctx: ChannelHandlerContext, e: MessageEvent): Unit = { // (2)
    val ch = e.getChannel // (10)
    ch.write(e.getMessage)

では、訳。


これまでとの違いは、コンソールに出力していた受信データを送り返すことだけです。

(10)
ChannelEventオブジェクトは、関連するChannelへの参照を持っています。
※注 ChannelEventインターフェースは、MessageEventインターフェースの親インターフェースです
ここで、ChannelEvent#getChannelから返却されたChannelは、MessageEventが受け取った接続を表しています。

もう1度telnetコマンドを実行してみましょう、あなたが送った内容をサーバ送り返してくるのを見ることができるでしょう。


では、実行。

> 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 ← 自分で打った内容
Hello ← サーバから戻ってきた内容
World
World

今回は、sbt側には何も出ません。