博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
netty 学习 (1)
阅读量:6474 次
发布时间:2019-06-23

本文共 5905 字,大约阅读时间需要 19 分钟。

  hot3.png

Server与Client建立连接后,会执行以下的步骤:
1、Client向Server发送消息:Are you ok?
2、Server接收客户端发送的消息,并打印出来。
3、Server端向客户端发送消息:I am ok!
4、Client接收Server端发送的消息,并打印出来,通讯结束。
涉及到的类有4个:
1、HelloServer :server类,启动Netty server
2、HelloServerInHandler:server的handler,接收客户端消息,并向客户端发送消息
3、HelloClient:client类,建立于Netty server的连接

4、HelloClientIntHandler:client的handler,接收server端的消息,并向服务端发送消息

一、先加入必要的类库:

二、HelloServer代码如下:

package com.yao.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelOption;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioServerSocketChannel;public class HelloServer {	public void start(int port) throws Exception {		EventLoopGroup bossGroup = new NioEventLoopGroup();		EventLoopGroup workerGroup = new NioEventLoopGroup();		try {			ServerBootstrap b = new ServerBootstrap();			b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)					.childHandler(new ChannelInitializer
() { @Override public void initChannel(SocketChannel ch) throws Exception { // 注册handler ch.pipeline().addLast(new HelloServerInHandler()); } }).option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); ChannelFuture f = b.bind(port).sync(); f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { HelloServer server = new HelloServer(); server.start(8000); }}
三、
HelloServerInHandler代码如下:
package com.yao.netty;import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;// 该handler是InboundHandler类型public class HelloServerInHandler extends ChannelInboundHandlerAdapter {	private static Log logger = LogFactory.getLog(HelloServerInHandler.class);	@Override	public void channelRead(ChannelHandlerContext ctx, Object msg)			throws Exception {		logger.info("HelloServerInHandler.channelRead");		ByteBuf result = (ByteBuf) msg;		byte[] result1 = new byte[result.readableBytes()];		// msg中存储的是ByteBuf类型的数据,把数据读取到byte[]中		result.readBytes(result1);		String resultStr = new String(result1);		// 接收并打印客户端的信息		System.out.println("Client said:" + resultStr);		// 释放资源,这行很关键		result.release();		// 向客户端发送消息		String response = "I am ok!";		// 在当前场景下,发送的数据必须转换成ByteBuf数组		ByteBuf encoded = ctx.alloc().buffer(4 * response.length());		encoded.writeBytes(response.getBytes());		ctx.write(encoded);		ctx.flush();	}	@Override	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {		ctx.flush();	}}
四、
HelloClient代码如下:

package com.yao.netty;import io.netty.bootstrap.Bootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelOption;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioSocketChannel;public class HelloClient {	public void connect(String host, int port) throws Exception {		EventLoopGroup workerGroup = new NioEventLoopGroup();		try {			Bootstrap b = new Bootstrap();			b.group(workerGroup).channel(NioSocketChannel.class).option(ChannelOption.SO_KEEPALIVE, true)			.handler(new ChannelInitializer
() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new HelloClientIntHandler()); } }); // Start the client. ChannelFuture f = b.connect(host, port).sync(); // Wait until the connection is closed. f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { HelloClient client = new HelloClient(); client.connect("127.0.0.1", 8000); }}
五、
HelloClientIntHandler代码如下:

package com.yao.netty;import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class HelloClientIntHandler extends ChannelInboundHandlerAdapter {	private static Log logger = LogFactory.getLog(HelloClientIntHandler.class);	// 接收server端的消息,并打印出来	@Override	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {		logger.info("HelloClientIntHandler.channelRead");		ByteBuf result = (ByteBuf) msg;		byte[] result1 = new byte[result.readableBytes()];		result.readBytes(result1);		System.out.println("Server said:" + new String(result1));		result.release();	}	// 连接成功后,向server发送消息	@Override	public void channelActive(ChannelHandlerContext ctx) throws Exception {		logger.info("HelloClientIntHandler.channelActive");		String msg = "Are you ok?";		ByteBuf encoded = ctx.alloc().buffer(4 * msg.length());		encoded.writeBytes(msg.getBytes());		ctx.write(encoded);		ctx.flush();	}}
六、还有log4j.xml文件:

总结:
通过上面简单的实例可以发现:
1、在没有任何encoder、decoder的情况下,Netty发送接收数据都是按照ByteBuf的形式,其它形式都是不合法的。
2、接收发送数据操作都是通过handler实现的,handler在netty中占据了非常重要的位置。
3、netty的handler是基于事件触发的,例如当client连接server成功后,client中的HelloClientIntHandler的channelActive方法会自动调用。

转载于:https://my.oschina.net/jamaly/blog/272342

你可能感兴趣的文章
招商银行信用卡重要通知:消费提醒服务调整,300元以下消费不再逐笔发送短信...
查看>>
python全栈_002_Python3基础语法
查看>>
C#_delegate - 调用列表
查看>>
[转]Windows的批处理脚本
查看>>
多维数组元素的地址
查看>>
数据库运维体系_SZMSD
查看>>
福大软工1816 · 第三次作业 - 结对项目1
查看>>
静态库 调试版本 和发布版本
查看>>
JAVA中的finalize()方法
查看>>
慕课网学习手记--炫丽的倒计时效果Canvas绘图与动画基础
查看>>
基本分类方法——KNN(K近邻)算法
查看>>
.NET Framework3.0/3.5/4.0/4.5新增功能摘要
查看>>
php中表单提交复选框与下拉列表项
查看>>
熟悉常用的Linux操作
查看>>
面象过程与面象对象
查看>>
谷歌设置支持webgl
查看>>
js的AJAX请求有关知识总结
查看>>
Eclipse添加新server时无法选择Tomcat7的问题
查看>>
nginx 配置https 负载均衡
查看>>
双拓扑排序 HDOJ 5098 Smart Software Installer
查看>>