《netty权威指南》学习笔记2

来源:互联网 发布:淘宝开店会员名大全 编辑:程序博客网 时间:2024/06/06 02:38

模拟一个订单接收服务器和客户端:

服务器端代码如下:

package orange.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelHandlerAdapter;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;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;import io.netty.handler.codec.serialization.ClassResolvers;import io.netty.handler.codec.serialization.ObjectDecoder;import io.netty.handler.codec.serialization.ObjectEncoder;import io.netty.handler.logging.LogLevel;import io.netty.handler.logging.LoggingHandler;/** * 服务器接受订单,采用java原生序列化订单类 */public class NettyOrderServerDemo {public void connect(int port) throws InterruptedException{EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try{ServerBootstrap b = new ServerBootstrap();b.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG,100).handler(new LoggingHandler(LogLevel.INFO)).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new ObjectDecoder(1024*1024,ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader())));ch.pipeline().addLast(new ObjectEncoder());ch.pipeline().addLast(new SubReqServerHandler());}});System.out.println("服务器启动");//绑定端口,同步等待成功ChannelFuture f = b.bind(port).sync();//等待服务器监听端口关闭f.channel().closeFuture().sync();}finally{bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}public static void main(String[] args) throws InterruptedException {new NettyOrderServerDemo().connect(9999);}}class SubReqServerHandler extends ChannelInboundHandlerAdapter //ChannelHandlerAdapter{@Overridepublic void channelRead(ChannelHandlerContext ctx,Object msg){SubscribeReq req = (SubscribeReq)msg;System.out.println("收到请求:    "+req.toString());if("orange".equalsIgnoreCase(req.getUserName())){ctx.writeAndFlush(resp(req.getSubReqID()));}}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){//cause.printStackTrace();ctx.close();}private SubscribeResponse resp(int subReqID){SubscribeResponse resp = new SubscribeResponse();resp.setSubReqID(subReqID);resp.setResponseCode(0);resp.setDesc("你们好啊");return resp;}}//订单类 class SubscribeReq implements java.io.Serializable{private int subReqID;//订单IDprivate String userName;//用户名private String productName;//产品名private String phoneNumber;//电话号private String address;//地址@Overridepublic String toString(){return "SubscribeReq[subReqID="+subReqID+",userName="+userName+",productName="+productName+",phoneNeme="+phoneNumber+",address="+address+"]";}public int getSubReqID() {return subReqID;}public void setSubReqID(int subReqID) {this.subReqID = subReqID;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}}
客户端代码如下:

package orange.netty;/** * 客户端提交订单,采用java原生序列化 */import io.netty.bootstrap.Bootstrap;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelHandlerAdapter;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;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;import io.netty.channel.socket.nio.NioSocketChannel;import io.netty.handler.codec.serialization.ClassResolvers;import io.netty.handler.codec.serialization.ObjectDecoder;import io.netty.handler.codec.serialization.ObjectEncoder;import io.netty.handler.logging.LogLevel;import io.netty.handler.logging.LoggingHandler;public class NettyOrderClientDemo {public void connect(String host,int port) throws InterruptedException{EventLoopGroup group = new NioEventLoopGroup();try{Bootstrap b = new Bootstrap();b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY,true).handler(new ChannelInitializer<SocketChannel>(){@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new ObjectDecoder(1024*1024,ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader())));ch.pipeline().addLast(new ObjectEncoder());ch.pipeline().addLast(new SubReqClientHandler());}});// 发起异步连接操作            ChannelFuture f = b.connect(host, port).sync();            // 等待客户端链路关闭            f.channel().closeFuture().sync();}finally{group.shutdownGracefully();}}public static void main(String[] args) throws InterruptedException {new NettyOrderClientDemo().connect("127.0.0.1", 9999);}}class SubReqClientHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelActive(ChannelHandlerContext ctx){for(int i=0;i<2;i++){ctx.write(subReq(i));System.out.println("sned!!!");}ctx.flush();}@Override    public void channelRead(ChannelHandlerContext ctx, Object msg){System.out.println("收到服务器回复:"+ msg);}    @Override    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {        System.out.println("server channelReadComplete..");        ctx.flush();    }    @Override    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)            throws Exception {        System.out.println("server exceptionCaught..");        cause.printStackTrace();        ctx.close();    }        private SubscribeReq subReq(int subReqID)    {    SubscribeReq req = new SubscribeReq();    req.setSubReqID(subReqID);    req.setUserName("orange");    req.setAddress("SJZ");    req.setProductName("矿泉水");    req.setPhoneNumber("1111");    return req;    }}//订单响应类class SubscribeResponse implements java.io.Serializable{private int subReqID;//订单IDprivate int responseCode;//返回码private String desc;//备注public int getSubReqID() {return subReqID;}public void setSubReqID(int subReqID) {this.subReqID = subReqID;}public int getResponseCode() {return responseCode;}public void setResponseCode(int responseCode) {this.responseCode = responseCode;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}@Overridepublic String toString(){return "SubscribeReq[subReqID="+subReqID+",responseCode="+responseCode+",desc="+desc+"]";}}


阅读全文
0 0
原创粉丝点击