Netty 5 的包
服务器,四个Java文件
1 SubReqServer.java
[java] view plain copy print?
- package com.test.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;
- 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 SubReqServer {
-
- public void bind(int nPort) throws Exception {
-
- 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
- public void initChannel(SocketChannel ch) throws Exception{
- ch.pipeline()
- .addLast(
- new ObjectDecoder(1024*1024,
- ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader())))
- .addLast(new ObjectEncoder())
- .addLast(new SubReqServerHandler());
- }
- });
-
- ChannelFuture f = b.bind(nPort).sync();
- System.out.println("---------------wait for connect");
- f.channel().closeFuture().sync();
- }finally {
- System.out.println("---------------wait for connect Error!");
- bossGroup.shutdownGracefully();
- workerGroup.shutdownGracefully();
- }
- }
-
-
- public static void main(String[] args){
- int nPort = 5656;
- nPort = Integer.valueOf(nPort);
- System.out.println("---------------Main start");
- try {
- new SubReqServer().bind(nPort);
- } catch (Exception e) {
- System.out.println("---------------Main Error");
- e.printStackTrace();
- }
- }
- }
2 SubReqServerHandler.java
[java] view plain copy print?
- package com.test.netty;
-
- import io.netty.channel.ChannelHandlerAdapter;
- import io.netty.channel.ChannelHandlerContext;
-
- public class SubReqServerHandler extends ChannelHandlerAdapter{
-
- @Override
- public void channelActive(ChannelHandlerContext ctx){
- System.out.println("--------------------------------handler channelActive------------");
-
-
-
-
-
-
-
-
-
-
-
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg)
- throws Exception{
-
-
-
-
-
-
-
-
-
-
- SubscribeResp resp = new SubscribeResp();
- resp.setnSubReqID(555);
- resp.setRespCode(0);
- resp.setDesc("-------Netty book order succeed, 3days later, sent to the designated address");
- ctx.writeAndFlush(resp);
-
-
-
- SubscribeReq req = (SubscribeReq)msg;
- if("XXYY".equalsIgnoreCase(req.getUserName())){
- System.out.println("接收到的数据: [ " + req.toString() + " ]");
- }
-
- }
-
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){
- System.out.println("---------------exceptionCaught 网络异常,关闭网络");
- cause.printStackTrace();
- ctx.close();
- }
- }
3 SubscribeReq.java
[java] view plain copy print?
- package com.test.netty;
-
- import java.io.Serializable;
-
- public class SubscribeReq implements Serializable{
-
- private static final long nSerialVerUID = 1L;
- private int nSubReqID;
- private String strUserName;
- private String strProductName;
- private String strPhoneNumber;
-
- private String strAddr;
-
- public final int getSubReqID(){
- return nSubReqID;
- }
-
- public final void setSubReqID(int nSubReqID){
- this.nSubReqID = nSubReqID;
- }
-
- public final String getUserName(){
- return strUserName;
- }
-
- public final void setUserName(String strUserName){
- this.strUserName = strUserName;
- }
-
- public final String getProductName(){
- return strProductName;
- }
-
- public final void setProductName(String strProductName){
- this.strProductName = strProductName;
- }
-
- public final String getPhoneNumber(){
- return strPhoneNumber;
- }
-
- public final void setPhoneNumber(String strPhoneNumber){
- this.strPhoneNumber = strPhoneNumber;
- }
-
- public final String getAddress(){
- return strAddr;
- }
-
- public final void setAddress(String strAddr){
- this.strAddr = strAddr;
- }
-
-
- @Override
- public String toString(){
- return "----SubscribeReq[subReqID="+ nSubReqID + ",userName="+ strUserName
- +",productName="+strProductName+",phoneNumber="+strPhoneNumber
- +",address"+strAddr+"]";
- }
-
-
- }
4 SubscribeResp.java
[java] view plain copy print?
- package com.test.netty;
-
- import java.io.Serializable;
-
- public class SubscribeResp implements Serializable{
- private static final long nSerialVerUID = 2L;
-
- private int nSubReqID;
-
- private int nRespCode;
-
- private String strDesc;
-
- public final int getnSubReqID() {
- return nSubReqID;
- }
-
- public final void setnSubReqID(int nSubReqID) {
- this.nSubReqID = nSubReqID;
- }
-
- public final int getnRespCode() {
- return nRespCode;
- }
-
- public final void setRespCode(int nRespCode) {
- this.nRespCode = nRespCode;
- }
-
- public final String getstrDesc() {
- return strDesc;
- }
-
- public final void setDesc(String strDesc) {
- this.strDesc = strDesc;
- }
-
- @Override
- public String toString() {
- return "SubscribeResp [nSubReqID=" + nSubReqID + ", nRespCode=" + nRespCode
- + ", strDesc=" + strDesc + "]";
- }
- }
客户端 :
SubReqClient.java
SubReqClientHand.java
SubscribeReq.java
SubscribeResp.java
和服务器一致
1 SubReqClient.java
[java] view plain copy print?
- package com.test.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;
- import io.netty.handler.codec.serialization.ClassResolvers;
- import io.netty.handler.codec.serialization.ObjectDecoder;
- import io.netty.handler.codec.serialization.ObjectEncoder;
-
- public class SubReqClient {
-
- public void connect(int nPort, String strHost) throws Exception{
- EventLoopGroup group = new NioEventLoopGroup();
- try{
- Bootstrap b = new Bootstrap();
- b.group(group).channel(NioSocketChannel.class)
- .option(ChannelOption.TCP_NODELAY, true)
- .handler(new ChannelInitializer<SocketChannel>(){
- @Override
- public void initChannel(SocketChannel ch) throws Exception{
- ch.pipeline().addLast(
- new ObjectDecoder(1024, ClassResolvers
- .cacheDisabled(this.getClass().getClassLoader())));
-
- ch.pipeline().addLast(new ObjectEncoder());
- ch.pipeline().addLast(new SubReqClientHanler());
- }
- });
-
- ChannelFuture f = b.connect(strHost, nPort).sync();
-
-
-
-
-
-
-
- f.channel().closeFuture().sync();
-
-
- }finally{
- System.out.println("----------------main get channel Error !!! ---------");
-
- }
- }
-
-
- public static void main(String[] args){
- int nPort = 5656;
- String strHost = "127.0.0.1";
- try {
- System.out.println("----------------main connect");
- new SubReqClient().connect(nPort, strHost);
- } catch (Exception e) {
- System.out.println("----------------main Error");
- e.printStackTrace();
- }
- }
- }
2 SubReqClient.java
[java] view plain copy print?
- package com.test.netty;
-
-
- import io.netty.channel.ChannelHandlerAdapter;
- import io.netty.channel.ChannelHandlerContext;
-
- public class SubReqClientHanler extends ChannelHandlerAdapter{
-
- public SubReqClientHanler(){
-
- }
-
- @Override
- public void channelActive(ChannelHandlerContext ctx){
- System.out.println("----------------handler channelActive-----准备发送十个数据-------");
-
- for(int i = 0; i<10; i++){
-
- SubscribeReq req = new SubscribeReq();
- req.setAddress("深圳蛇口");
- req.setPhoneNumber("13888886666");
- req.setProductName("Netty Book");
- req.setSubReqID(i);
- req.setUserName("XXYY");
- ctx.write(req);
- }
- ctx.flush();
- }
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg)
- throws Exception{
- System.out.println("--------channelRead---服务器发来的数据为:[" + msg + "]");
- }
-
- @Override
- public void channelReadComplete(ChannelHandlerContext ctx)
- throws Exception{
- System.out.println("----------------handler channelReadComplete");
- ctx.flush();
- }
-
-
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){
- System.out.println("--------------------------------------------------------------------------handler exceptionCaught");
- cause.printStackTrace();
- ctx.close();
- }
-
- }
运行结果:
服务器端:
---------------Main start
三月 30, 2016 2:47:15 下午 io.netty.handler.logging.LoggingHandler channelRegistered
信息: [id: 0x00370b13] REGISTERED
三月 30, 2016 2:47:15 下午 io.netty.handler.logging.LoggingHandler bind
信息: [id: 0x00370b13] BIND: 0.0.0.0/0.0.0.0:5656
---------------wait for connect
三月 30, 2016 2:47:15 下午 io.netty.handler.logging.LoggingHandler channelActive
信息: [id: 0x00370b13, /0:0:0:0:0:0:0:0:5656] ACTIVE
三月 30, 2016 2:47:24 下午 io.netty.handler.logging.LoggingHandler channelRead
信息: [id: 0x00370b13, /0:0:0:0:0:0:0:0:5656] RECEIVED: [id: 0x9e332f55, /127.0.0.1:56219 => /127.0.0.1:5656]
--------------------------------handler channelActive------------
接收到的数据: [ ----SubscribeReq[subReqID=0,userName=XXYY,productName=Netty Book,phoneNumber=13888886666,address深圳蛇口] ]
接收到的数据: [ ----SubscribeReq[subReqID=1,userName=XXYY,productName=Netty Book,phoneNumber=13888886666,address深圳蛇口] ]
接收到的数据: [ ----SubscribeReq[subReqID=2,userName=XXYY,productName=Netty Book,phoneNumber=13888886666,address深圳蛇口] ]
接收到的数据: [ ----SubscribeReq[subReqID=3,userName=XXYY,productName=Netty Book,phoneNumber=13888886666,address深圳蛇口] ]
接收到的数据: [ ----SubscribeReq[subReqID=4,userName=XXYY,productName=Netty Book,phoneNumber=13888886666,address深圳蛇口] ]
接收到的数据: [ ----SubscribeReq[subReqID=5,userName=XXYY,productName=Netty Book,phoneNumber=13888886666,address深圳蛇口] ]
接收到的数据: [ ----SubscribeReq[subReqID=6,userName=XXYY,productName=Netty Book,phoneNumber=13888886666,address深圳蛇口] ]
接收到的数据: [ ----SubscribeReq[subReqID=7,userName=XXYY,productName=Netty Book,phoneNumber=13888886666,address深圳蛇口] ]
接收到的数据: [ ----SubscribeReq[subReqID=8,userName=XXYY,productName=Netty Book,phoneNumber=13888886666,address深圳蛇口] ]
接收到的数据: [ ----SubscribeReq[subReqID=9,userName=XXYY,productName=Netty Book,phoneNumber=13888886666,address深圳蛇口] ]
客户端:
----------------main connect
----------------handler channelActive-----准备发送十个数据-------
--------channelRead---服务器发来的数据为:[SubscribeResp [nSubReqID=555, nRespCode=0, strDesc=-------Netty book order succeed, 3days later, sent to the designated address]]
--------channelRead---服务器发来的数据为:[SubscribeResp [nSubReqID=555, nRespCode=0, strDesc=-------Netty book order succeed, 3days later, sent to the designated address]]
--------channelRead---服务器发来的数据为:[SubscribeResp [nSubReqID=555, nRespCode=0, strDesc=-------Netty book order succeed, 3days later, sent to the designated address]]
----------------handler channelReadComplete
--------channelRead---服务器发来的数据为:[SubscribeResp [nSubReqID=555, nRespCode=0, strDesc=-------Netty book order succeed, 3days later, sent to the designated address]]
--------channelRead---服务器发来的数据为:[SubscribeResp [nSubReqID=555, nRespCode=0, strDesc=-------Netty book order succeed, 3days later, sent to the designated address]]
--------channelRead---服务器发来的数据为:[SubscribeResp [nSubReqID=555, nRespCode=0, strDesc=-------Netty book order succeed, 3days later, sent to the designated address]]
--------channelRead---服务器发来的数据为:[SubscribeResp [nSubReqID=555, nRespCode=0, strDesc=-------Netty book order succeed, 3days later, sent to the designated address]]
--------channelRead---服务器发来的数据为:[SubscribeResp [nSubReqID=555, nRespCode=0, strDesc=-------Netty book order succeed, 3days later, sent to the designated address]]
--------channelRead---服务器发来的数据为:[SubscribeResp [nSubReqID=555, nRespCode=0, strDesc=-------Netty book order succeed, 3days later, sent to the designated address]]
--------channelRead---服务器发来的数据为:[SubscribeResp [nSubReqID=555, nRespCode=0, strDesc=-------Netty book order succeed, 3days later, sent to the designated address]]
----------------handler channelReadComplete
源码
http://download.csdn.NET/detail/yulinxx/9476749