接下来我们将展示如何构建一个基于Netty的客户端和服务器,程序很简单:客户端将消息发送给服务器,而服务器再将消息回送给客户端,这将是一个对你而言很重要的第一个netty的实践经验。
1、设置开发环境
编译和运行,我们需要准备JDK和Apache Maven工具,这里建议大家使用Java的集成开发环境(IDE)。
如果你已经安装了JDK,那么可以略过此步。
否则,请从http://java.com/en/download/manual.jsp 处获取JDK第8版,请下载JDK,而不是Java运行环境(JRE),其仅仅可以运行Java应用程序,但不够编译它们。
有关安装说明:
——将环境变量JAVA_HOME设置为你的JDK安装位置
——将%JAVA_HOME%\bin添加到你的执行路径
下面是使用最广泛的Java IDE,都可以免费获取
——Eclipse——www.eclipse.org
——Intellij IDEA Community Edition——www.jetbrains.com
有关MAVEN的安装也与Java JDK安装类似
2、Netty客户端/服务器概览
图2-1展示了我们将要编写的Echo客户端和服务器应用程序,即使可能我们要编写基于Web的用于被浏览器访问的应用程序,但是通过同时实现客户端和服务器,你一定能更加全面地理解Netty的API。
虽然图中也展示了我们一开始所说的多个客户端,所能够支持的客户端数量,在理论上,仅受限于系统的可用资源(以及所使用的JDK版本可能会施加的限制)。
Echo客户端和服务器之间的交互非常简单,其本身也充分体现了客户端/服务器系统中典型的请求-响应交互模式。
3、编写Echo服务器
所有的Netty服务器都需要以下两个部分:
——至少一个ChannelHandler——该组件实现了服务器对从客户端接收的数据的处理,即它的业务逻辑。
——引导——配置服务器的启动代码,将服务器绑定到它要监听连接请求的端口上。
我们的服务器会响应传入的消息,需要实现ChannelInboundHandler接口,用来定义响应入站事件的方法,对于此应用而言只需要用到少量的这些方法,所以继承ChannelInboundHandlerAdapter类就足够了,它提供了ChannelInboundHandler的默认实现。
——channelRead():对于每个传入的消息都要调用
——channelReadComplete():通知ChannelInboundHandler最后一次对channelRead()的调用时当前批量读取中的最后一条消息
——exceptionCaught():在读取操作期间,有异常跑出会调用
代码清单2-1,展示Echo服务器的ChannelHandler实现EchoServerHandler。
@ChannelHandler.Sharable //标示一个ChannelHandler可以被多个Channel安全地共享
public class EchoServerHandler extends ChannelInboundHandlerAdapter{
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf in = (ByteBuf)msg;
System.out.println("Server received: " + in.toString(CharsetUtil.UTF_8));//将消息记录到控制台
ctx.write(in);//将接受到的消息写给发送者,而不冲刷出站消息·
}
@Override
publ