Netty编程06

首先要用protobuf.exe生成Java类,具体参考《netty权威指南》第8章。 工具链接:http://download.csdn.net/download/qq_16192007/9989616

需要生成SubScribeReqProto和SubscribeRespProto才可以进行以下操作。。

SubReqServer.java

public class SubReqServer {

	public static void main(String[] args) {
		int port = 8099;
		new SubReqServer().bind(port);
	}

	public void bind(int port) {

		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>() {

						@Override
						protected void initChannel(SocketChannel ch) throws Exception {

							ch.pipeline().addLast(new ProtobufVarint32FrameDecoder());
							ch.pipeline()
									.addLast(new ProtobufDecoder(SubScribeReqProto.SubScribeReq.getDefaultInstance()));
							ch.pipeline().addLast(new ProtobufVarint32LengthFieldPrepender());
							ch.pipeline().addLast(new ProtobufEncoder());
							ch.pipeline().addLast(new SubReqServerHandler());
						}
					});

			ChannelFuture f = b.bind(port).sync();
			f.channel().closeFuture().sync();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			try {
				bossGroup.shutdownGracefully().sync();
				workerGroup.shutdownGracefully().sync();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

}

SubReqServerHandler.java

public class SubReqServerHandler extends ChannelInboundHandlerAdapter {

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

		SubScribeReqProto.SubScribeReq req = (SubScribeReqProto.SubScribeReq) msg;
		if ("love".equals(req.getUserName())) {

			System.out.println("Service accpet client subscribe req :[" + req.toString() + "]");

			ctx.writeAndFlush(resp(req.getSubReqID()));
		}

	}

	private SubscribeRespProto.SubscribeResp resp(int subReqID) {

		SubscribeRespProto.SubscribeResp.Builder builder = SubscribeRespProto.SubscribeResp.newBuilder();
		builder.setSubReqID(subReqID);
		builder.setRespCode(0);
		builder.setDesc("Netty book order succeed,3 days later,sendt to the designated address");

		return builder.build();
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

		cause.printStackTrace();
		ctx.close();
	}

}

SubReqClient.java

public class SubReqClient {
	
	public static void main(String[] args) {
		
		String host = "127.0.0.1";
		int port = 8099;
		new SubReqClient().connect(port, host);
	}
	
	
	public void connect(int port,String host){
		
		EventLoopGroup group = new NioEventLoopGroup();
		
		try {
			Bootstrap b = new Bootstrap();
			b.group(group)
			 .channel(NioSocketChannel.class)
			 .handler(new ChannelInitializer<SocketChannel>() {

				@Override
				protected void initChannel(SocketChannel ch) throws Exception {
					
					ch.pipeline().addLast(new ProtobufVarint32FrameDecoder());
					ch.pipeline().addLast(new ProtobufDecoder(SubscribeRespProto.SubscribeResp.getDefaultInstance()));
					ch.pipeline().addLast(new ProtobufVarint32LengthFieldPrepender());
					ch.pipeline().addLast(new ProtobufEncoder());
					ch.pipeline().addLast(new SubReqClientHandler());
					
				}
				 
			});
			
			ChannelFuture f = b.connect(host, port).sync();
			f.channel().closeFuture().sync();
		
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally {
			try {
				group.shutdownGracefully().sync();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}

}

SubReqClientHandler.java

public class SubReqClientHandler extends ChannelInboundHandlerAdapter {

	public SubReqClientHandler() {

	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {

		for (int i = 0; i < 10; i++) {
			ctx.write(subReq(i));
		}
		ctx.flush();
	}

	private SubScribeReqProto.SubScribeReq subReq(int i) {

		SubScribeReqProto.SubScribeReq.Builder builder = SubScribeReqProto.SubScribeReq.newBuilder();
		builder.setSubReqID(i);
		builder.setUserName("love");
		builder.setProductName("Netty book");
		List<String> address = new ArrayList<>();
		address.add("NanJing");
		address.add("Beijing");
		address.add("Shenzhen");
		address.add("Guangzhou");
		builder.addAllAddress(address);

		return builder.build();
	}

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

		System.out.println("Receive server response :[" + msg + "]");
	}

	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

		ctx.flush();
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

		cause.printStackTrace();
		ctx.close();

	}

}

转载于:https://my.oschina.net/u/3269608/blog/1542646

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值