zoukankan      html  css  js  c++  java
  • JavaTCP粘包、拆包

    import java.nio.ByteBuffer;
    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    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.DelimiterBasedFrameDecoder;
    import io.netty.handler.codec.FixedLengthFrameDecoder;
    import io.netty.handler.codec.string.StringDecoder;
    import io.netty.handler.codec.string.StringEncoder;
    
    public class Server {
    
    	public static void main(String[] args) throws Exception{
    		//1 创建2个线程,一个是负责接收客户端的连接。一个是负责进行数据传输的
    		EventLoopGroup pGroup = new NioEventLoopGroup();
    		EventLoopGroup cGroup = new NioEventLoopGroup();
    		
    		//2 创建服务器辅助类
    		ServerBootstrap b = new ServerBootstrap();
    		b.group(pGroup, cGroup)
    		 .channel(NioServerSocketChannel.class)
    		 .option(ChannelOption.SO_BACKLOG, 1024)
    		 .option(ChannelOption.SO_SNDBUF, 32*1024)
    		 .option(ChannelOption.SO_RCVBUF, 32*1024)
    		 .childHandler(new ChannelInitializer<SocketChannel>() {
    			@Override
    			protected void initChannel(SocketChannel sc) throws Exception {
    				//设置特殊分隔符
    				ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes());
    				sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, buf));
    				//设置字符串形式的解码
    				sc.pipeline().addLast(new StringDecoder());
    				sc.pipeline().addLast(new ServerHandler());
    			}
    		});
    		
    		//4 绑定连接
    		ChannelFuture cf = b.bind(8765).sync();
    		
    		//等待服务器监听端口关闭
    		cf.channel().closeFuture().sync();
    		pGroup.shutdownGracefully();
    		cGroup.shutdownGracefully();
    		
    	}
    }
    

      

    import io.netty.bootstrap.Bootstrap;
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelInitializer;
    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.DelimiterBasedFrameDecoder;
    import io.netty.handler.codec.FixedLengthFrameDecoder;
    import io.netty.handler.codec.string.StringDecoder;
    import io.netty.handler.codec.string.StringEncoder;
    
    public class Client {
    
    	public static void main(String[] args) throws Exception {
    		
    		EventLoopGroup group = new NioEventLoopGroup();
    		
    		Bootstrap b = new Bootstrap();
    		b.group(group)
    		 .channel(NioSocketChannel.class)
    		 .handler(new ChannelInitializer<SocketChannel>() {
    			@Override
    			protected void initChannel(SocketChannel sc) throws Exception {
    				//
    				ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes());
    				sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, buf));
    				sc.pipeline().addLast(new StringDecoder());
    				sc.pipeline().addLast(new ClientHandler());
    			}
    		});
    		
    		ChannelFuture cf = b.connect("127.0.0.1", 8765).sync();
    		
    		cf.channel().writeAndFlush(Unpooled.wrappedBuffer("bbbb$_".getBytes()));
    		cf.channel().writeAndFlush(Unpooled.wrappedBuffer("cccc$_".getBytes()));
    		
    		
    		//等待客户端端口关闭
    		cf.channel().closeFuture().sync();
    		group.shutdownGracefully();
    		
    	}
    }
    

      

    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelHandlerAdapter;
    import io.netty.channel.ChannelHandlerContext;
    
    public class ServerHandler extends ChannelHandlerAdapter {
    	
    	@Override
    	public void channelActive(ChannelHandlerContext ctx) throws Exception {
    		System.out.println(" server channel active... ");
    	}
    
    	@Override
    	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    		String request = (String)msg;
    		System.out.println("Server :" + msg);
    		String response = "服务器响应:" + msg + "$_";
    		ctx.writeAndFlush(Unpooled.copiedBuffer(response.getBytes()));
    	}
    
    	@Override
    	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
    		
    	}
    
    	@Override
    	public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) throws Exception {
    		ctx.close();
    	}
    }
    

      

    import io.netty.channel.ChannelHandlerAdapter;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.util.ReferenceCountUtil;
    
    public class ClientHandler extends ChannelHandlerAdapter{
    
    	@Override
    	public void channelActive(ChannelHandlerContext ctx) throws Exception {
    		System.out.println("client channel active... ");
    	}
    
    	@Override
    	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    		try {
    			String response = (String)msg;
    			System.out.println("Client: " + response);
    		} finally {
    			ReferenceCountUtil.release(msg);
    		}
    	}
    
    	@Override
    	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
    	}
    
    	@Override
    	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    		ctx.close();
    	}
    
    }
    

      

    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelHandler;
    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.logging.LogLevel;
    import io.netty.handler.logging.LoggingHandler;
    import io.netty.handler.timeout.ReadTimeoutHandler;
    
    public class Server {
        public Server() {
        }
    
        public static void main(String[] args) throws Exception {
            EventLoopGroup pGroup = new NioEventLoopGroup();
            EventLoopGroup cGroup = new NioEventLoopGroup();
            ServerBootstrap b = new ServerBootstrap();
            ((ServerBootstrap)((ServerBootstrap)((ServerBootstrap)b.group(pGroup, cGroup).channel(NioServerSocketChannel.class)).option(ChannelOption.SO_BACKLOG, 1024)).handler(new LoggingHandler(LogLevel.INFO))).childHandler(new ChannelInitializer<SocketChannel>() {
                protected void initChannel(SocketChannel sc) throws Exception {
                    sc.pipeline().addLast(new ChannelHandler[]{MarshallingCodeCFactory.buildMarshallingDecoder()});
                    sc.pipeline().addLast(new ChannelHandler[]{MarshallingCodeCFactory.buildMarshallingEncoder()});
                    sc.pipeline().addLast(new ChannelHandler[]{new ReadTimeoutHandler(5)});
                    sc.pipeline().addLast(new ChannelHandler[]{new ServerHandler()});
                }
            });
            ChannelFuture cf = b.bind(8765).sync();
            cf.channel().closeFuture().sync();
            pGroup.shutdownGracefully();
            cGroup.shutdownGracefully();
        }
    }
    

      

    import io.netty.bootstrap.Bootstrap;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelHandler;
    import io.netty.channel.ChannelInitializer;
    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.logging.LogLevel;
    import io.netty.handler.logging.LoggingHandler;
    import io.netty.handler.timeout.ReadTimeoutHandler;
    import java.util.concurrent.TimeUnit;
    
    public class Client {
        private EventLoopGroup group;
        private Bootstrap b;
        private ChannelFuture cf;
    
        public static Client getInstance() {
            return Client.SingletonHolder.instance;
        }
    
        private Client() {
            this.group = new NioEventLoopGroup();
            this.b = new Bootstrap();
            ((Bootstrap)((Bootstrap)((Bootstrap)this.b.group(this.group)).channel(NioSocketChannel.class)).handler(new LoggingHandler(LogLevel.INFO))).handler(new ChannelInitializer<SocketChannel>() {
                protected void initChannel(SocketChannel sc) throws Exception {
                    sc.pipeline().addLast(new ChannelHandler[]{MarshallingCodeCFactory.buildMarshallingDecoder()});
                    sc.pipeline().addLast(new ChannelHandler[]{MarshallingCodeCFactory.buildMarshallingEncoder()});
                    sc.pipeline().addLast(new ChannelHandler[]{new ReadTimeoutHandler(5)});
                    sc.pipeline().addLast(new ChannelHandler[]{new ClientHandler()});
                }
            });
        }
    
        public void connect() {
            try {
                this.cf = this.b.connect("127.0.0.1", 8765).sync();
                System.out.println("远程服务器已经连接, 可以进行数据交换..");
            } catch (Exception var2) {
                var2.printStackTrace();
            }
    
        }
    
        public ChannelFuture getChannelFuture() {
            if (this.cf == null) {
                this.connect();
            }
    
            if (!this.cf.channel().isActive()) {
                this.connect();
            }
    
            return this.cf;
        }
    
        public static void main(String[] args) throws Exception {
            final Client c = getInstance();
            ChannelFuture cf = c.getChannelFuture();
    
            for(int i = 1; i <= 3; ++i) {
                Request request = new Request();
                request.setId("" + i);
                request.setName("pro" + i);
                request.setRequestMessage("数据信息" + i);
                cf.channel().writeAndFlush(request);
                TimeUnit.SECONDS.sleep(4L);
            }
    
            cf.channel().closeFuture().sync();
            (new Thread(new Runnable() {
                public void run() {
                    try {
                        System.out.println("进入子线程...");
                        ChannelFuture cf = c.getChannelFuture();
                        System.out.println(cf.channel().isActive());
                        System.out.println(cf.channel().isOpen());
                        Request request = new Request();
                        request.setId("4");
                        request.setName("pro4");
                        request.setRequestMessage("数据信息4");
                        cf.channel().writeAndFlush(request);
                        cf.channel().closeFuture().sync();
                        System.out.println("子线程结束.");
                    } catch (InterruptedException var3) {
                        var3.printStackTrace();
                    }
    
                }
            })).start();
            System.out.println("断开连接,主线程结束..");
        }
    
        private static class SingletonHolder {
            static final Client instance = new Client((Client)null);
    
            private SingletonHolder() {
            }
        }
    }
  • 相关阅读:
    解决 搭建Jekins过程中 启动Tomcat的java.net.UnknownHostException异常
    射手和农场主
    java 和 JS(javaScript)中的反斜杠正则转义
    分享修改密码的SharePoint Web part: ITaCS Change Password web part
    分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机
    Office 365 的公共网站的一些限制及解决的办法
    SharePoint 2013 关闭 customErrors
    安装 KB2844286 导致SharePoint 2010 XSLT web part 显示出现错误
    安装Office Web Apps Server 2013 – KB2592525安装失败
    如何将hyper-v虚拟机转换成vmware的虚拟机- 转换SharePoint 2010 Information Worker Demonstration and Evaluation Virtual Machine (SP1)
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/10930124.html
Copyright © 2011-2022 走看看