今度は、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側には何も出ません。