前回作成した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