当前位置: 首页 > wzjs >正文

贵阳网站建设 网站制作wordpress调用当前分类名称

贵阳网站建设 网站制作,wordpress调用当前分类名称,石家庄网站建设蓝点,wordpress语言编程吗目录 如何使用? 1. 示例代码(基于Netty) 2. 关键参数解释 3. 协议格式示例 4. 常见配置场景 场景1:长度字段包含自身 场景2:长度字段在消息中间 5. 注意事项 举个例子 完整示例:客户端与服务端交互…

目录

如何使用?

1. 示例代码(基于Netty)

2. 关键参数解释

3. 协议格式示例

4. 常见配置场景

场景1:长度字段包含自身

场景2:长度字段在消息中间

5. 注意事项

举个例子

完整示例:客户端与服务端交互流程

1. 服务端代码(含响应)

2. 客户端代码(含编码器)

3. 执行流程说明

4. 网络包结构示意图

5. 关键点总结


如何使用?

以下是使用 LengthFieldBasedFrameDecoder 解决 TCP 粘包/拆包问题的 完整代码示例关键解释


1. 示例代码(基于Netty)

// Server端代码示例
public class NettyServer {public static void main(String[] args) {EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {// 关键:添加 LengthFieldBasedFrameDecoderch.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024,    // maxFrameLength(最大帧长度)0,       // lengthFieldOffset(长度字段偏移量)4,       // lengthFieldLength(长度字段占4字节)0,       // lengthAdjustment(长度调整值)4        // initialBytesToStrip(跳过前4字节,因为长度字段已解析)));// 将ByteBuf转为String(按需替换为实际解码器)ch.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));// 自定义业务处理器ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {System.out.println("Received message: " + msg);}});}});ChannelFuture future = bootstrap.bind(8080).sync();future.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}

2. 关键参数解释

LengthFieldBasedFrameDecoder 的构造函数参数如下:

参数

说明

maxFrameLength

允许的最大帧长度(防止内存溢出)

lengthFieldOffset

长度字段的起始偏移量(通常为0)

lengthFieldLength

长度字段占用的字节数(例如4字节表示int)

lengthAdjustment

长度字段值后的内容长度调整(若长度字段包含自身长度,需调整)

initialBytesToStrip

解析后跳过的字节数(例如跳过长度字段本身)


3. 协议格式示例

假设自定义协议格式如下(长度字段在前):

+--------+----------------+
| Length |   Actual Data  |
| 4字节  |   (变长内容)    |
+--------+----------------+

4. 常见配置场景

场景1:长度字段包含自身
// 长度字段包含自身(如总长度= Length字段长度 + 数据长度)
new LengthFieldBasedFrameDecoder(1024, 0, 4, -4, 0);
// lengthAdjustment = -4(扣除长度字段自身占用的4字节)
场景2:长度字段在消息中间
// 消息格式:[Header][Length][Data]
new LengthFieldBasedFrameDecoder(1024, 2, 4, 0, 6);
// lengthFieldOffset=2(跳过Header的2字节)
// initialBytesToStrip=6(跳过Header+Length字段)

5. 注意事项

  1. 参数匹配协议:必须与协议中长度字段的位置和计算方式一致。
  2. 编解码顺序LengthFieldBasedFrameDecoder 需作为第一个解码器添加到Pipeline。
  3. 异常处理:建议配合 ExceptionHandler 处理解码失败的情况。

通过这种方式,Netty 会自动根据长度字段切分完整的数据包,彻底解决粘包/拆包问题

举个例子


完整示例:客户端与服务端交互流程

1. 服务端代码(含响应)
public class NettyServer {public static void main(String[] args) throws InterruptedException {EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {// 添加长度字段解码器ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 4));// 字符串解码器ch.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));// 业务处理器(返回响应)ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {System.out.println("[Server] Received: " + msg);// 返回响应(添加长度前缀)ctx.writeAndFlush("ACK: " + msg);}});}});ChannelFuture future = bootstrap.bind(8080).sync();future.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}
2. 客户端代码(含编码器)
public class NettyClient {public static void main(String[] args) throws InterruptedException {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap bootstrap = new Bootstrap();bootstrap.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {// 添加编码器(为消息添加长度前缀)ch.pipeline().addLast(new MessageToByteEncoder<String>() {@Overrideprotected void encode(ChannelHandlerContext ctx, String msg, ByteBuf out) {byte[] bytes = msg.getBytes(CharsetUtil.UTF_8);out.writeInt(bytes.length); // 写入4字节长度字段out.writeBytes(bytes);      // 写入实际数据}});// 响应解码器(与服务端解码器对称)ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 4));ch.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));// 业务处理器(打印响应)ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {System.out.println("[Client] Received: " + msg);}});}});ChannelFuture future = bootstrap.connect("localhost", 8080).sync();// 发送两条测试消息(自动处理粘包)future.channel().writeAndFlush("Hello Netty");future.channel().writeAndFlush("Test Message");future.channel().closeFuture().sync();} finally {group.shutdownGracefully();}}
}

3. 执行流程说明

  1. 客户端发送消息
    • 编码器将字符串转换为 长度字段(4字节) + 实际数据 的二进制格式。
    • 示例消息 "Hello Netty" 的传输格式:
+----------+-----------------+
| 0x00000B | "Hello Netty"   |  // 0x00000B = 11字节(字符串长度)
+----------+-----------------+
  1. 服务端解析消息
    • LengthFieldBasedFrameDecoder 根据长度字段切分完整数据包。
    • StringDecoder 将二进制数据转为字符串,业务处理器打印并返回响应。
  1. 客户端接收响应
    • 服务端返回的 "ACK: Hello Netty" 同样通过长度字段编码。
    • 客户端解码器解析后打印响应信息。

4. 网络包结构示意图

客户端发送:
[Length=11][Data="Hello Netty"][Length=12][Data="Test Message"]服务端接收:
[Length=11][Data="Hello Netty"] → 完整解析为独立消息
[Length=12][Data="Test Message"] → 完整解析为独立消息服务端响应:
[Length=16][Data="ACK: Hello Netty"]
[Length=17][Data="ACK: Test Message"]

5. 关键点总结

  • 编码对称性:客户端和服务端的编解码器需匹配(长度字段位置一致)。
  • 自动分包LengthFieldBasedFrameDecoder 自动处理TCP流中的粘包/拆包。
  • 性能保障:基于长度字段的解析效率极高,适合高频数据传输场景。

运行示例后,你将在控制台看到完整的请求-响应日志,验证粘包问题的解决效果。


文章转载自:

http://cy7RX5dt.sgnjg.cn
http://sFGWIlHW.sgnjg.cn
http://SKSBEgND.sgnjg.cn
http://ymuHH1M1.sgnjg.cn
http://nxsgIX3L.sgnjg.cn
http://j0PNnWna.sgnjg.cn
http://RKF25z8b.sgnjg.cn
http://4K1GJpkQ.sgnjg.cn
http://5rrDTyTu.sgnjg.cn
http://wDj73A7l.sgnjg.cn
http://gIJVhl8F.sgnjg.cn
http://3y58zGM4.sgnjg.cn
http://YKh9YCNL.sgnjg.cn
http://pHubUaea.sgnjg.cn
http://nl7AAJN0.sgnjg.cn
http://ocy85CR8.sgnjg.cn
http://d5JMoZBg.sgnjg.cn
http://HewopBOl.sgnjg.cn
http://pS2EQ5dO.sgnjg.cn
http://qiB78Z5c.sgnjg.cn
http://eA5NOVOM.sgnjg.cn
http://gvNgDc1P.sgnjg.cn
http://0PiLvOTU.sgnjg.cn
http://IPJU34wB.sgnjg.cn
http://Z3gqoN1R.sgnjg.cn
http://44jxnzZ5.sgnjg.cn
http://otBSAzz5.sgnjg.cn
http://lA3C6Vjk.sgnjg.cn
http://fXjwavyE.sgnjg.cn
http://AVeYlU2T.sgnjg.cn
http://www.dtcms.com/wzjs/693482.html

相关文章:

  • WordPress的IP统计插件做竞价的网站可以做优化吗
  • 酒店网站建设背景分析做网站的程序员
  • 用服务器做网站空间wordpress 小工具定制
  • api模式网站开发怀化 优化生育政策
  • 网站开发费用如何账务处理win10优化软件
  • 南京做网站费用wordpress4.9.8 php版本
  • 网站seo关键词排名优化制作网站的第一步
  • 吉林市 网站建设团队拓展游戏
  • 制作网站素材个人网站设计说明
  • 网站维护中是什么意思.net作业做网站
  • 娄底建网站建立网站有免费的吗
  • 免费的游戏网站建设建设银行官方网网址
  • 漂亮的数据型网站番禺网站建设番禺网络营销
  • php学完可以做网站秦皇岛网站制作费用
  • 网址交易网站福田蒙派克10座黄牌报价
  • wordpress视频网站采集有没有做微场景的网站
  • 电脑做系统教学网站河北网站制作公司报价
  • 南京市建设工程造价管理处网站重庆市工程新希望官网
  • 网站建设公司工资设置搭建一个企业网站
  • wordpress做视频站苏州注册公司流程和费用
  • iis网站正在建设中wordpress js手工合并
  • 摄影网站制作设计网页视频怎么下载到电脑
  • 诚信网站体系建设工作大型网站开发用的技术
  • 怎样制作购物网站 微信转发郴州市北湖区
  • 个人网站开发 服务器手机app官方安装下载
  • 做一个网站的完整教程做网站 数据库
  • 网站怎么换空间商广州站在哪里
  • 鞍山网站制作品牌服务推广
  • 易思企业网站网站页面设计规范
  • 企业网站建设推广费用高端电子网站建设