Netty入门案例
来源:互联网 发布:macbook彻底删除软件 编辑:程序博客网 时间:2024/06/07 14:53
项目组要写一个心跳机制,用的netty3.x,所以就学习了一下netty,网上有很多例子,自己记录下做个参考,先把简单的例子跑通,后面再深入研究。
- 服务端Server启动代码
- Server端处理的Handler
- 客户端Client启动类
- Client端Handler
服务端Server启动代码
package com.netty3.demo;import org.jboss.netty.bootstrap.ServerBootstrap;import org.jboss.netty.channel.ChannelPipeline;import org.jboss.netty.channel.ChannelPipelineFactory;import org.jboss.netty.channel.Channels;import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;import org.jboss.netty.handler.codec.string.StringDecoder;import org.jboss.netty.handler.codec.string.StringEncoder;import java.net.InetSocketAddress;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * Create by koma on 2017/11/27 */public class Server { public static void main(String[] args) { // Server启动类 ServerBootstrap bootstrap = new ServerBootstrap(); // boss线程监听端口,worker线程负责数据读写 ExecutorService boss = Executors.newCachedThreadPool(); ExecutorService worker = Executors.newCachedThreadPool(); // 设置niosocket工厂 bootstrap.setFactory(new NioServerSocketChannelFactory(boss, worker)); // 设置管道的工厂 bootstrap.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { ChannelPipeline pipeline = Channels.pipeline(); // 字符串编解码,如果传递的是自己自定义的bean类,可以使用ObjectDecoder和ObjectEncoder pipeline.addLast("decoder", new StringDecoder()); pipeline.addLast("encoder", new StringEncoder()); pipeline.addLast("serverHandler", new ServerHandler()); return pipeline; } }); // 绑定到本机的端口号 bootstrap.bind(new InetSocketAddress(10086)); System.out.println("Server Start!!!"); }}
Server端处理的Handler
package com.netty3.demo;import org.jboss.netty.channel.*;/** * Create by koma on 2017/11/27 */public class ServerHandler extends SimpleChannelHandler { // 消息处理 @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { super.messageReceived(ctx, e); // 可以直接强转,因为已经定义过了字符串编解码了 String s = (String) e.getMessage(); System.out.println("Server get message: "+s); //回写到client数据 ctx.getChannel().write("Server already get your message!!"); } // 异常处理 @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { super.exceptionCaught(ctx, e); System.out.println("出现异常了!!!"); } // 建立新的连接触发 @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { super.channelConnected(ctx, e); System.out.println("连接建立"); } // 连接已经建立,通道关闭触发 @Override public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { super.channelDisconnected(ctx, e); System.out.println("通道关闭!!"); }}
客户端Client启动类
package com.netty3.demo;import org.jboss.netty.bootstrap.ClientBootstrap;import org.jboss.netty.channel.*;import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;import org.jboss.netty.handler.codec.string.StringDecoder;import org.jboss.netty.handler.codec.string.StringEncoder;import java.net.InetSocketAddress;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * Create by koma on 2017/11/27 */public class Client { public static void main(String[] args) { //服务类 ClientBootstrap bootstrap = new ClientBootstrap(); //线程池 ExecutorService boss = Executors.newCachedThreadPool(); ExecutorService worker = Executors.newCachedThreadPool(); //socket工厂 bootstrap.setFactory(new NioClientSocketChannelFactory(boss, worker)); //管道工厂 bootstrap.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { ChannelPipeline pipeline = Channels.pipeline(); pipeline.addLast("decoder", new StringDecoder()); pipeline.addLast("encoder", new StringEncoder()); pipeline.addLast("clientHandler", new ClientHandler()); return pipeline; } }); //连接服务端 ChannelFuture connect = bootstrap.connect(new InetSocketAddress("127.0.0.1", 10086)); Channel channel = connect.getChannel(); System.out.println("client start!!"); channel.write("hello, netty");// bootstrap.releaseExternalResources(); }}
Client端Handler
package com.netty3.demo;import org.jboss.netty.channel.ChannelHandlerContext;import org.jboss.netty.channel.MessageEvent;import org.jboss.netty.channel.SimpleChannelHandler;/** * Create by koma on 2017/11/27 */public class ClientHandler extends SimpleChannelHandler { // 只重写这一个方法了,ServerHandler已经重写过了 @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { super.messageReceived(ctx, e); // 收到从server端传来的信息 String str=(String)e.getMessage(); System.out.println("Client get mesage: " + str); }}
阅读全文
0 0
- Netty入门案例
- netty 入门案例hello world
- netty案例
- netty案例
- netty案例
- Java网络编程之Netty入门案例-yellowcong
- 【Netty入门】Netty概述
- Netty 入门
- Netty入门
- Netty入门
- netty入门
- Netty入门
- Netty入门
- Netty入门
- netty入门
- Netty入门
- netty小案例demo
- Netty传输服务案例
- Thymeleaf教程 (十三) 附件:基础对象和web参数访问方式。
- django-6-第三方
- SpringMVC数据校验
- Python语言入门(五)函数与默认参数、可变参数
- Android之retrofit初步使用
- Netty入门案例
- 7. Reverse Integer
- 初级DBA知识
- Data Analytics with Hadoop.pdf 英文原版 免费下载
- 嵌入式软件开发相关
- 02、启动|关闭MySQL服务
- Using Flume.pdf 英文原版 免费下载
- 内存不对齐访问(unaligned access)及汇编下宕机—ARM架构从入门到砸板跑路
- 171122 逆向-ARM汇编基础(1)