城市直播房产教育博客汽车
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

详解什么是TCP粘包和拆包现象并演示Netty是如何解决的

2月18日 菩提门投稿
  概述
  本文介绍什么是TCP粘包和拆包现象,并通过Netty编写详细的案例来重现TCP粘包问题,最后再通过一个Netty的demo来解决这个问题。具体内容如下什么是TCP粘包和拆包现象重现TCP粘包和拆包现象Netty解决TCP粘包和拆包现象带来的问题什么是TCP粘包和拆包现象
  TCP编程底层都有粘包和拆包机制,因为我们在CS这种传输模型下,以TCP协议传输的时候,在网络中的byte其实就像是河水,TCP就像一个搬运工,将这流水从一端转送到另一端,这时又分两种情况:如果客户端的每次制造的水比较多,也就是我们常说的客户端给的包比较大,TCP这个搬运工就会分多次去搬运如果客户端每次制造的水比较少的话,TCP可能会等客户端多次生产之后,把所有的水一起再运输到另一端对于第一种情况,TCP会再客户端先进行拆包,在另一端接收的时候,需要把多次获取的结果组合在一起,变成我们可以理解的信息对于第二种情况,TCP会在客户端先进行粘包,在另一端接收的时候,就必须进行拆包处理,因为每次接收的信息,可能是另一个远程端多次发送的包,被TCP粘在一起的重现TCP粘包和拆包现象通过在客户端1次发送超大数据包给服务器端来重现TCP拆包现象通过在客户端分10次发送较小的数据包给服务器端来重现TCP粘包现象
  下面通过Netty重现TCP粘包和拆包现象。Nettymaven依赖dependencygroupIdio。nettygroupIdnettyallartifactIdversion4。1。76。Finalversiondependency通过Netty重现TCP拆包现象Netty客户端启动类:NettyClientpackagecom。ckjava。test。importio。netty。bootstrap。Bimportio。netty。channel。ChannelIimportio。netty。channel。ChannelOimportio。netty。channel。ChannelPimportio。netty。channel。EventLoopGimportio。netty。channel。nio。NioEventLoopGimportio。netty。channel。socket。SocketCimportio。netty。channel。socket。nio。NioSocketCimportlombok。extern。slf4j。Slf4j;importorg。springframework。stereotype。CSlf4jComponentpublicclassNettyClient{staticfinalStringHOSTSystem。getProperty(host,127。0。0。1);staticfinalintPORTInteger。parseInt(System。getProperty(port,8080));staticfinalintSIZEInteger。parseInt(System。getProperty(size,256));publicstaticvoidmain(String〔〕args)throwsException{初始化客户端事件组EventLoopGroupgroupnewNioEventLoopGroup();try{BootstrapbnewBootstrap();b。group(group)初始化通道。channel(NioSocketChannel。class)。option(ChannelOption。TCPNODELAY,true)。handler(newChannelInitializerSocketChannel(){初始化通道处理器OverridepublicvoidinitChannel(SocketChannelch){ChannelPipelinepch。pipeline();p。addLast(newNettyClientHandler());}});b。connect(HOST,PORT)。addListener(future{log。info(String。format(连接服务器端:s:s成功!,HOST,PORT));})。await();}catch(Exceptione){log。error(启动客户端出现异常,e);}}}Netty客户端通道处理类:NettyClientHandlerpackagecom。ckjava。test。importio。netty。buffer。ByteBimportio。netty。buffer。Uimportio。netty。channel。ChannelHandlerCimportio。netty。channel。SimpleChannelInboundHimportlombok。extern。slf4j。Slf4j;importjava。nio。charset。StandardCimportjava。util。concurrent。TimeUimportjava。util。concurrent。atomic。AtomicISlf4jpublicclassNettyClientHandlerextendsSimpleChannelInboundHandlerByteBuf{privatefinalAtomicIntegercountRefnewAtomicInteger(0);客户端读取服务器发送的信息OverrideprotectedvoidchannelRead0(ChannelHandlerContextctx,ByteBufmsg)throwsException{byte〔〕buffernewbyte〔msg。readableBytes()〕;msg。readBytes(buffer);StringmessagenewString(buffer,StandardCharsets。UTF8);log。info(String。format(客户端接收到消息:〔s〕,message));log。info(String。format(客户端接收到消息的次数:s,countRef。accumulateAndGet(1,Integer::sum)));log。info();}重写channelActive,当客户端启动的时候自动发送数据给服务端OverridepublicvoidchannelActive(ChannelHandlerContextctx)throwsException{客户端只发送一次,但是本次数据量很大tcp会将数据拆分成多份后依次进行发送SStringBuilderstringBuildernewStringBuilder(data);for(inti0;i10000;i){stringBuilder。append(data);}ByteBufbufferUnpooled。copiedBuffer(数据stringBuilder。toString(),StandardCharsets。UTF8);ctx。writeAndFlush(buffer);}OverridepublicvoidexceptionCaught(ChannelHandlerContextctx,Throwablecause){ctx。close();}}
  其中关键的代码如下重写channelActive,当客户端启动的时候自动发送数据给服务端OverridepublicvoidchannelActive(ChannelHandlerContextctx)throwsException{客户端只发送一次,但是本次数据量很大tcp会将数据拆分成多份后依次进行发送SStringBuilderstringBuildernewStringBuilder(data);for(inti0;i10000;i){stringBuilder。append(data);}ByteBufbufferUnpooled。copiedBuffer(数据stringBuilder。toString(),StandardCharsets。UTF8);ctx。writeAndFlush(buffer);}Netty客户端启动类:NettyClientpackagecom。ckjava。test。importio。netty。bootstrap。ServerBimportio。netty。channel。ChannelIimportio。netty。channel。ChannelOimportio。netty。channel。EventLoopGimportio。netty。channel。nio。NioEventLoopGimportio。netty。channel。socket。SocketCimportio。netty。channel。socket。nio。NioServerSocketCimportlombok。extern。slf4j。Slf4j;importorg。springframework。stereotype。Cimportjava。net。InetSocketASlf4jComponentpublicclassNettyServer{publicNettyServer(intport){this。}publicvoidstart(){EventLoopGroupbossGroupnewNioEventLoopGroup(1);EventLoopGroupworkerGroupnewNioEventLoopGroup();try{ServerBootstrapsbsnewServerBootstrap()。group(bossGroup,workerGroup)。channel(NioServerSocketChannel。class)。localAddress(newInetSocketAddress(port))。childHandler(newChannelInitializerSocketChannel(){protectedvoidinitChannel(SocketChannelch){ch。pipeline()。addLast(newNettyServerHandler());}})。option(ChannelOption。SOBACKLOG,128)。childOption(ChannelOption。SOKEEPALIVE,true);绑定端口,开始接收进来的连接sbs。bind(port)。addListener(future{log。info(String。format(服务器端启动成功,开放端口:s,port));});}catch(Exceptione){log。error(启动服务器端出现异常,e);}}publicstaticvoidmain(String〔〕args){intport8080;newNettyServer(port)。start();}}Netty服务器端通道处理类:NettyServerpackagecom。ckjava。test。importio。netty。buffer。ByteBimportio。netty。buffer。Uimportio。netty。channel。ChannelHandlerCimportio。netty。channel。SimpleChannelInboundHimportlombok。extern。slf4j。Slf4j;importjava。nio。charset。StandardCimportjava。util。UUID;Slf4jpublicclassNettyServerHandlerextendsSimpleChannelInboundHandlerByteBuf{OverrideprotectedvoidchannelRead0(ChannelHandlerContextctx,ByteBufmsg){byte〔〕buffernewbyte〔msg。readableBytes()〕;msg。readBytes(buffer);将buffer转为字符串StringmessagenewString(buffer,StandardCharsets。UTF8);System。out。println(服务器收到的数据message);System。out。println(服务器收到的数据次数(this。count));服务器回送数据给客户端回送一个随机idByteBufbuffer1Unpooled。copiedBuffer(UUID。randomUUID()。toString(),StandardCharsets。UTF8);ctx。writeAndFlush(buffer1);}OverridepublicvoidexceptionCaught(ChannelHandlerContextctx,Throwablecause)throwsException{cause。printStackTrace();ctx。close();}}分别先启动服务器端后,再启动客户端,服务器端的输出如下
  客户端的输出如下17:03:24。474〔nioEventLoopGroup21〕INFOcom。ckjava。test。client。NettyClient连接服务器端:127。0。0。1:8080成功!17:03:24。535〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息:〔c471a239abe5440193aab3d5e432c422021b6ae349394d59b451235af6c9e2190536b0aa3b534b03bb68b0637d619d0f〕17:03:24。537〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息的次数:117:03:24。537〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler从服务器端和客户端的输出结果来看:客户端只发送了1次数据,但是服务器端却收到了3次数据,说明tcp在客户端拆包后分3次发送了;并且客户端之后只收到了一次数据,说明服务器的回复数据在服务器端也出现了粘包现象,并且导致了数据无法区分的问题。通过Netty重现TCP粘包现象还用上面的例子,将客户端通道处理类:NettyClientHandler中的channelActive方法修改成如下的方式重写channelActive,当客户端启动的时候自动发送数据给服务端OverridepublicvoidchannelActive(ChannelHandlerContextctx)throwsException{使用客户端分10次发送,每次数据量少tcp会等客户端多次生产后,一次性进行发送for(inti0;i10;i){ByteBufbufferUnpooled。copiedBuffer(ckjavai,StandardCharsets。UTF8);ctx。writeAndFlush(buffer);}}分别先启动服务器端后,再启动客户端,服务器端的输出如下17:12:27。239〔nioEventLoopGroup21〕INFOcom。ckjava。test。server。NettyServer服务器端启动成功,开放端口:8080服务器收到的数据ckjava0ckjava1ckjava2ckjava3ckjava4ckjava5ckjava6ckjava7ckjava8ckjava9服务器收到的数据次数1客户端的输出如下17:12:36。917〔nioEventLoopGroup21〕INFOcom。ckjava。test。client。NettyClient连接服务器端:127。0。0。1:8080成功!17:12:36。961〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息:〔31b25c25bd324ff1b3900c31b2558d12〕17:12:36。962〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息的次数:117:12:36。962〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler从服务器端和客户端的输出结果来看:客户端只发送了10次数据,但是服务器端却收到了1次数据,说明tcp在客户端粘包后一次性发送了全部的数据。Netty解决TCP粘包和拆包现象带来的问题TCP粘包和拆包现象带来的问题
  从上面的案例可以发现当出现TCP粘包和拆包现象后会出现下面的问题:tcp在粘包的时候,数据混合后,接收方不能正确区分数据的头尾,如果是文件类型的数据,会导致文件破坏。tcp在拆包的时候,数据拆分后,接收方不能正确区分数据的头尾,导致收到的消息错乱,影响语义。如何解决TCP粘包和拆包现象带来的问题
  由于TCP粘包和拆包现象会导致不能正确区分数据的头尾,那么解决的办法也挺简单的,通过特殊字符串来分隔消息体或者使用定长消息就能够正确区分数据的头尾。
  目前的主流解决方式有以下几种:使用定长消息,Client和Server双方约定报文长度,Server端接受到报文后,按指定长度解析;使用特定分隔符,比如在消息尾部增加分隔符。Server端接收到报文后,按照特定的分割符分割消息后,再解析;将消息分割为消息头和消息体两部分,消息头中指定消息或者消息体的长度,通常设计中使用消息头第一个字段int32表示消息体的总长度;
  Netty中也提供了基于分隔符实现的半包解码器和定长的半包解码器:LineBasedFrameDecoder使用和r作为分割符的解码器DelimiterBasedFrameDecoder使用自定义的分割符的解码器FixedLengthFrameDecoder定长解码器通过Netty的DelimiterBasedFrameDecoder解码器来解决TCP粘包和拆包现象带来的问题
  使用DelimiterBasedFrameDecoder可以确保收到的数据会自动通过自定义的分隔符进行分隔。发送的时候消息的后面只需要增加上自定义的分隔符即可。基于上面的例子,服务器端NettyServer改动如下publicvoidstart(){EventLoopGroupbossGroupnewNioEventLoopGroup(1);EventLoopGroupworkerGroupnewNioEventLoopGroup();try{ServerBootstrapsbsnewServerBootstrap()。group(bossGroup,workerGroup)。channel(NioServerSocketChannel。class)。localAddress(newInetSocketAddress(port))。childHandler(newChannelInitializerSocketChannel(){protectedvoidinitChannel(SocketChannelch){使用分隔符的半包解码器ByteBufbyteBufUnpooled。copiedBuffer(DELIMITER。getBytes());ch。pipeline()。addLast(newDelimiterBasedFrameDecoder(1024,byteBuf));ch。pipeline()。addLast(newNettyServerHandler());}})。option(ChannelOption。SOBACKLOG,128)。childOption(ChannelOption。SOKEEPALIVE,true);绑定端口,开始接收进来的连接sbs。bind(port)。addListener(future{log。info(String。format(服务器端启动成功,开放端口:s,port));});}catch(Exceptione){log。error(启动服务器端出现异常,e);}}服务器端NettyServerHandler改动如下OverrideprotectedvoidchannelRead0(ChannelHandlerContextctx,ByteBufmsg){byte〔〕buffernewbyte〔msg。readableBytes()〕;msg。readBytes(buffer);将buffer转为字符串StringmessagenewString(buffer,StandardCharsets。UTF8);System。out。println(服务器收到的数据message);System。out。println(服务器收到的数据次数(this。count));服务器回送数据给客户端回送一个随机idStringreplyDataUUID。randomUUID()。toString();ByteBufbuffer1Unpooled。copiedBuffer(replyData。concat(NettyServer。DELIMITER),StandardCharsets。UTF8);ctx。writeAndFlush(buffer1);System。out。println(服务器回复数据replyData);}客户端NettyClient改动如下publicstaticvoidmain(String〔〕args)throwsException{初始化客户端事件组EventLoopGroupgroupnewNioEventLoopGroup();try{BootstrapbnewBootstrap();b。group(group)初始化通道。channel(NioSocketChannel。class)。option(ChannelOption。TCPNODELAY,true)。handler(newChannelInitializerSocketChannel(){初始化通道处理器OverridepublicvoidinitChannel(SocketChannelch){ChannelPipelinepch。pipeline();使用分隔符的半包解码器ByteBufbyteBufUnpooled。copiedBuffer(DELIMITER。getBytes());ch。pipeline()。addLast(newDelimiterBasedFrameDecoder(1024,byteBuf));p。addLast(newNettyClientHandler());}});b。connect(HOST,PORT)。addListener(future{log。info(String。format(连接服务器端:s:s成功!,HOST,PORT));})。await();}catch(Exceptione){log。error(启动客户端出现异常,e);}}客户端NettyClientHandler中接收数据的部分不变,发送数据的地方改动如下重写channelActive,当客户端启动的时候自动发送数据给服务端OverridepublicvoidchannelActive(ChannelHandlerContextctx)throwsException{tcp粘包现象使用客户端分10次发送,每次数据量少tcp会等客户端多次生产后,一次性进行发送for(inti0;i10;i){Slog。info(String。format(客户端发送消息:〔s〕,data));ByteBufbufferUnpooled。copiedBuffer(data。concat(NettyClient。DELIMITER),StandardCharsets。UTF8);ctx。writeAndFlush(buffer);}}服务器端输出如下18:14:33。627〔nioEventLoopGroup21〕INFOcom。ckjava。test。server。NettyServer服务器端启动成功,开放端口:8080服务器收到的数据ckjava0服务器收到的数据次数1服务器回复数据c6129b89c8694e0697ca55518c55aff7服务器收到的数据ckjava1服务器收到的数据次数2服务器回复数据bc3426cb072f4cb99f69d2797863c9e4服务器收到的数据ckjava2服务器收到的数据次数3服务器回复数据437907021978462ba86515c0ff2803af服务器收到的数据ckjava3服务器收到的数据次数4服务器回复数据4eb3e4e60c6a4cefa639d6c40ebc27d2服务器收到的数据ckjava4服务器收到的数据次数5服务器回复数据6a9f02f99e0d4eaea380605c3ba410d2服务器收到的数据ckjava5服务器收到的数据次数6服务器回复数据7ab9e20ea86b4f6886735bc024643274服务器收到的数据ckjava6服务器收到的数据次数7服务器回复数据3b6b68cfc0664e328b5a961c995fdd6d服务器收到的数据ckjava7服务器收到的数据次数8服务器回复数据cf2a5c5196d943098f051c09abbe04f2服务器收到的数据ckjava8服务器收到的数据次数9服务器回复数据4d586684be554c108071a88dad5f0684服务器收到的数据ckjava9服务器收到的数据次数10服务器回复数据22fd511ee65a4f109426f14b4524d4d0客户端输出如下18:14:50。056〔nioEventLoopGroup21〕INFOcom。ckjava。test。client。NettyClient连接服务器端:127。0。0。1:8080成功!18:14:50。058〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端发送消息:〔ckjava0〕18:14:50。075〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端发送消息:〔ckjava1〕18:14:50。076〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端发送消息:〔ckjava2〕18:14:50。076〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端发送消息:〔ckjava3〕18:14:50。076〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端发送消息:〔ckjava4〕18:14:50。076〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端发送消息:〔ckjava5〕18:14:50。076〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端发送消息:〔ckjava6〕18:14:50。077〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端发送消息:〔ckjava7〕18:14:50。077〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端发送消息:〔ckjava8〕18:14:50。077〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端发送消息:〔ckjava9〕18:14:50。104〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息:〔c6129b89c8694e0697ca55518c55aff7〕18:14:50。105〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息的次数:118:14:50。105〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler18:14:50。105〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息:〔bc3426cb072f4cb99f69d2797863c9e4〕18:14:50。105〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息的次数:218:14:50。105〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler18:14:50。106〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息:〔437907021978462ba86515c0ff2803af〕18:14:50。106〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息的次数:318:14:50。106〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler18:14:50。106〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息:〔4eb3e4e60c6a4cefa639d6c40ebc27d2〕18:14:50。106〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息的次数:418:14:50。106〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler18:14:50。106〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息:〔6a9f02f99e0d4eaea380605c3ba410d2〕18:14:50。106〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息的次数:518:14:50。106〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler18:14:50。106〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息:〔7ab9e20ea86b4f6886735bc024643274〕18:14:50。106〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息的次数:618:14:50。106〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler18:14:50。107〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息:〔3b6b68cfc0664e328b5a961c995fdd6d〕18:14:50。107〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息的次数:718:14:50。107〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler18:14:50。107〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息:〔cf2a5c5196d943098f051c09abbe04f2〕18:14:50。107〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息的次数:818:14:50。107〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler18:14:50。107〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息:〔4d586684be554c108071a88dad5f0684〕18:14:50。107〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息的次数:918:14:50。107〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler18:14:50。107〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息:〔22fd511ee65a4f109426f14b4524d4d0〕18:14:50。107〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler客户端接收到消息的次数:1018:14:50。107〔nioEventLoopGroup21〕INFOc。c。test。client。NettyClientHandler从上面的例子可以看出DelimiterBasedFrameDecoder会帮自动帮我们把消息切割好,确保收到的数据都是基于自定义分隔符分隔好的数据,但是不要忘记在发送数据的时候添加上自定义分隔符。
搜索 投诉 评论 转载

这群人,正在南美和非洲掘金非洲、南美等新兴市场,想靠Web3赶超欧美。这一言论看似有些遥不可及,但现实是,Web3浪潮的确已经吹向了新兴市场,虽然我们尚难以言明这是福是祸。援引区块链一些行业……不愿退役,回归勇士!维金斯的绝佳导师,库里四冠有你不小功劳早些时候,勇士和自由球员杰罗姆罗宾逊达成了一份非保障的训练营合同之后,勇士的阵容大名单来到了19人次,其中他们一共有13份正式合同,2份双向合同,4份训练营合同,如此一来,勇士……PUBG遭遇最大危机!缝合怪SUPERPEOPLE横空出世,今年的PUBG在游戏市场打压之下本来就过的不好,恰好在这个时候出现一个和PUBG几乎完全类似的游戏SUPERPEOPLE,和PUBG一样它也是一款吃鸡游戏,但它与PUBG又有些……现代人与古人的生活古代的修养得适,年纪都超过80。90岁甚至100岁了,精神还一样抖擞,行动起来动作还是那么的利索没有衰老的样子;现在的人们,年纪大点到了50岁这样,动作迟缓显得有气无力的。这是……房地产变为风险资产对我们有什么影响2022年10月24日,第一财经吹风认定房地产为风险投资,并给出了理由。第一、人口老龄化。也就是说人口下降是长期看空指标。第二、人口流动。也就是说人口流动是资产价格分化的……大衣哥准儿媳陈萌不要把我和某人作比较好吗是内涵陈亚男的1。2021年国庆节期间,大衣哥结婚才一年的儿子朱小伟(乳名)与前儿媳陈亚男闹起了分居;作为一个公众人物,大衣哥脸上自然挂不住。大衣哥前儿媳陈亚男卫校毕业、气质高雅、长相……蝗灾来时,人们为什么不吃蝗虫,而是选择活活饿死?油蚂蚱的美味,相信很多人都会认同。每次去泰安,同学都会在泰山脚下安排一顿大餐。其中,炸蚂蚱那是必须的。酥香脆,还有一种莫名的滋味,每次吃起炸蚂蚱,我都大快朵颐,且意犹未尽。可惜……何鸿燊陪嫁14亿,将28岁爱女嫁给东北小伙辛奇隆,他有何过人2019年6月7日,不止是娱乐圈,甚至整个国内都被赌王何鸿燊一家给惊呆了!这天是何鸿燊爱女何超盈过大礼的日子,男方为了迎娶她,准备了将近500多万的彩礼,光是大金链子、龙……已进耄耋之年的我,才理解什么叫真正的好朋友人生在世,遇见的人实在多。同学、同事、邻居以及生活中有来往的人难计其数,但绝大多数都如同路人,相互没有在乎之情。能给你温暖、关爱、帮助的人,除了有血缘关系的亲人便是好朋友。已进……详解什么是TCP粘包和拆包现象并演示Netty是如何解决的概述本文介绍什么是TCP粘包和拆包现象,并通过Netty编写详细的案例来重现TCP粘包问题,最后再通过一个Netty的demo来解决这个问题。具体内容如下什么是TCP粘包……二胎,想说要了不容易现在我们每一名成年人各种压力都非常大,而压力大的原因很多人不在乎是经济压力,住房压力和工作压力。因此,想二胎对于工薪人群,经济压力已经已成为了难以逾越的主要障碍。于是,很多年轻……鲜为人知的暴利行业,却是适合副业创业的赚钱好项目与过去相比,计生用品逐渐摆脱污名化,成为我们普通人的日常必需品。然而线下面对面的购买场景总是令人尴尬,自从前几年零售行业进入2。0时代起,人们可以通过电子商务渠道购买各类产品,……
比篮球比足球比武术2022中国机器人大赛将在福建举行LPL资格赛开战!JunJia首发上场,RNG麻了白研究Ji观众最盼着死的4位女主体验桌面战斗手游战锤40K战术将于8月推出数字经济到底是什么?让自己幸福的7个小方法巾帼不让须眉!女子三大球为国正名,中国男子三大球何时能崛起?我愿写文以悦己,不为他人呈悲欢AMD从头开始重建了其DirectX11驱动程序,平均性能提今日推荐高军保诗选,想起克拉玛依之歌我们这十年春暖花开时漫步美丽的京山河文案适合12。31跨年发的文案
山姆会员店晚上会打折吗那些模糊的过往孕妇穿什么裤子比较好秋季时尚孕妈冬天兰花的养殖方法和注意事项盆栽浅析公务员心理成长与健康建设的反腐意义贵州游玩攻略,这篇贵州旅游干货分享给大家,含行程景点费用热议 就医不必舍近求远,我院泌尿外科已全面开展泌尿系肿瘤微创治疗孙中山与汾酒之间的故事一场灾难,让我们彻底认清了你寄所知我的幸福家庭作文500字三篇1500米高空无人机被摧毁!中国新技术测试,美国奇袭王牌又少

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁