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

北京企业做网站报价重庆新华网

北京企业做网站报价,重庆新华网,网站做双拼域名什么意思,网站建设上线问题导航#xff1a;从零开始手写mmo游戏从框架到爆炸#xff08;零#xff09;—— 导航-CSDN博客 Netty帧解码器 Netty中#xff0c;提供了几个重要的可以直接使用的帧解码器。 LineBasedFrameDecoder 行分割帧解码器。适用场景#xff1a;每个上层数据包#xff0c;使…导航从零开始手写mmo游戏从框架到爆炸零—— 导航-CSDN博客    Netty帧解码器 Netty中提供了几个重要的可以直接使用的帧解码器。 LineBasedFrameDecoder 行分割帧解码器。适用场景每个上层数据包使用换行符或者回车换行符做为边界分割符。发送端发送的时候每个数据包之间以换行符/回车换行符作为分隔。在这种场景下只需要把这个解码器加到 pipeline 中Netty 会使用换行分隔符把底层帧分割成一个一个完整的应用层数据包发送到下一站。 FixedLengthFrameDecoder 固定长度帧解码器。适用场景每个上层数据包的长度都是固定的比如 100。在这种场景下只需要把这个解码器加到 pipeline 中Netty 会把底层帧拆分成一个个长度为 100 的数据包 (ByteBuf)发送到下一个 channelHandler入站处理器。 DelimiterBasedFrameDecoder 自定义分隔符帧解码器 。DelimiterBasedFrameDecoder 是LineBasedFrameDecoder的通用版本。不同之处在于这个解码器可以自定义分隔符而不是局限于换行符。如果使用这个解码器在发送的时候末尾必须带上对应的分隔符。 LengthFieldBasedFrameDecoder 自定义长度帧解码器。这是一种基于灵活长度的解码器。在数据包中加了一个长度字段长度域保存上层包的长度。解码的时候会按照这个长度进行上层ByteBuf应用包的提取。 我们之前使用的是自定义分隔符帧解码器现在我们改用自定义长度帧解码器。LengthFieldBasedFrameDecoder有几个参数我们看一起看一下 lengthFieldOffset 长度域的偏移量简单而言就是偏移几个字节是长度域lengthFieldLength 长度域的所占的字节数lengthAdjustment 长度值的调整值initialBytesToStrip 需要跳过的字节数 参考LengthFieldBasedFrameDecoder 详解-CSDN博客   现在我们就来修改编解码器同时修改相关的类。 byte数组传输 前两章我们已经完成了对消息体的封装和编解码器然后我们来修改相关的代码其实就是把原来string类型改为StringMessage类型 TcpMessageStringHandler.java import com.loveprogrammer.base.network.listener.INetworkEventListener; import com.loveprogrammer.base.network.support.SessionManager; import com.loveprogrammer.pojo.StringMessage; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component;/*** ClassName TcpMessageStringHandler* Description tcp消息处理类* Author admin* Date 2024/2/4 15:16* Version 1.0*/ Component Scope(prototype) public class TcpMessageStringHandler extends SimpleChannelInboundHandlerStringMessage {private static final Logger logger LoggerFactory.getLogger(TcpMessageStringHandler.class);Autowiredprivate INetworkEventListener listener;// public TcpMessageStringHandler(INetworkEventListener listener) { // this.listener listener; // }Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable throwable) {listener.onExceptionCaught(ctx,throwable);}Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {super.channelRead(ctx, msg);}Overrideprotected void channelRead0(ChannelHandlerContext ctx, StringMessage msg) {listener.channelRead(ctx,msg);// ctx.writeAndFlush(result);}Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {listener.onConnected(ctx);}Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {listener.onDisconnected(ctx);} }TcpServerStringInitializer.java import com.loveprogrammer.base.factory.SpringContextHelper; import com.loveprogrammer.base.network.listener.INetworkEventListener; import com.loveprogrammer.base.network.support.NetworkListener; import com.loveprogrammer.codec.MessageDecoder; import com.loveprogrammer.codec.MessageEncoder; import com.loveprogrammer.constants.ConstantValue; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.DelimiterBasedFrameDecoder; import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder;public class TcpServerStringInitializer extends ChannelInitializerSocketChannel {Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline pipeline ch.pipeline();// pipeline.addLast(framer,new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));pipeline.addLast(decoder, new MessageEncoder());pipeline.addLast(encoder, new MessageDecoder(ConstantValue.MESSAGE_CODEC_MAX_FRAME_LENGTH,ConstantValue.MESSAGE_CODEC_LENGTH_FIELD_OFFSET, ConstantValue.MESSAGE_CODEC_LENGTH_FIELD_LENGTH,ConstantValue.MESSAGE_CODEC_LENGTH_ADJUSTMENT, ConstantValue.MESSAGE_CODEC_INITIAL_BYTES_TO_STRIP, false));TcpMessageStringHandler handler (TcpMessageStringHandler) SpringContextHelper.getBean(TcpMessageStringHandler.class);pipeline.addLast(handler);}}INetworkEventListener.java public interface INetworkEventListener {/*** 连接建立** param ctx ChannelHandlerContext*/void onConnected(ChannelHandlerContext ctx);/*** 连接断开* * param ctx ChannelHandlerContext*/void onDisconnected(ChannelHandlerContext ctx);/*** 异常发生* * param ctx ChannelHandlerContext* * param throwable 异常*/void onExceptionCaught(ChannelHandlerContext ctx, Throwable throwable);void channelRead(ChannelHandlerContext ctx, StringMessage msg);} NetworkListener.java package com.loveprogrammer.base.network.support;import com.loveprogrammer.base.bean.session.Session; import com.loveprogrammer.base.network.listener.INetworkEventListener; import com.loveprogrammer.constants.CommonValue; import com.loveprogrammer.pojo.StringMessage; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component;Component public class NetworkListener implements INetworkEventListener {protected static final Logger logger LoggerFactory.getLogger(NetworkListener.class);Overridepublic void onConnected(ChannelHandlerContext ctx) {logger.info(建立连接);SessionManager.getInstance().create(ctx.channel());}Overridepublic void onDisconnected(ChannelHandlerContext ctx) {logger.info(建立断开);SessionManager.getInstance().close(ctx.channel());}Overridepublic void onExceptionCaught(ChannelHandlerContext ctx, Throwable throwable) {logger.warn(异常发生, throwable);}Overridepublic void channelRead(ChannelHandlerContext ctx, StringMessage msg) {logger.info(数据内容data msg.getBody());String result 我是服务器我收到了你的信息: msg.getBody();Session session SessionManager.getInstance().getSessionByChannel(ctx.channel());result ,sessionId session.getId();StringMessage message StringMessage.create(1,1);message.setStatusCode(CommonValue.MSG_STATUS_CODE_SUCCESS);message.setBody(result);SessionManager.getInstance().sendMessage(ctx.channel(),message);} }同样的client端也要跟着修改一下 SocketClient public class SocketClient {private static final Logger logger LoggerFactory.getLogger(SocketClient.class);private static final String IP 127.0.0.1;private static final int PORT 8088;private static EventLoopGroup group new NioEventLoopGroup();protected static void run() throws InterruptedException { // Bootstrap bootstrap new Bootstrap(); // bootstrap.group(group); // bootstrap.channel(NioSocketChannel.class); // bootstrap.handler(new ChannelInitializer() { // protected void initChannel(Channel ch) throws Exception { // ChannelPipeline pipeline ch.pipeline(); // pipeline.addLast(framer,new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); // pipeline.addLast(decoder,new StringDecoder()); // pipeline.addLast(encoder,new StringEncoder()); // pipeline.addLast(new SocketClientHandler()); // } // });Bootstrap bootstrap new Bootstrap();bootstrap.group(group);bootstrap.channel(NioSocketChannel.class);bootstrap.handler(new ChannelInitializer() {Overrideprotected void initChannel(Channel ch) {ChannelPipeline pipeline ch.pipeline();pipeline.addLast(encoder, new MessageEncoder());pipeline.addLast(decoder, new MessageDecoder(ConstantValue.MESSAGE_CODEC_MAX_FRAME_LENGTH,ConstantValue.MESSAGE_CODEC_LENGTH_FIELD_LENGTH, ConstantValue.MESSAGE_CODEC_LENGTH_FIELD_OFFSET,ConstantValue.MESSAGE_CODEC_LENGTH_ADJUSTMENT, ConstantValue.MESSAGE_CODEC_INITIAL_BYTES_TO_STRIP,false));pipeline.addLast(new SocketClientHandler());}});// 连接服务器ChannelFuture channelFuture bootstrap.connect(IP, PORT).sync();StringMessage msg StringMessage.create(1,1);msg.setStatusCode(200);msg.setBody(你好我是eric);// msg \r\n;channelFuture.channel().writeAndFlush(msg);logger.info(向服务器发送消息 {},msg);channelFuture.channel().closeFuture().sync();}public static void main(String[] args) throws InterruptedException {logger.info(开始连接Socket服务器...);try {run();} catch (Exception e) {e.printStackTrace();} finally {group.shutdownGracefully();}}}SocketClientHandler.java import com.loveprogrammer.pojo.StringMessage; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory;/*** ClassName SocketClientHandler* Description TODO* Author admin* Date 2024/1/29 17:41* Version 1.0*/ public class SocketClientHandler extends SimpleChannelInboundHandlerStringMessage {private static final Logger logger LoggerFactory.getLogger(SocketClientHandler.class);Overridepublic void exceptionCaught(ChannelHandlerContext arg0, Throwable arg1) {logger.info(异常发生, arg1);}Overridepublic void channelRead(ChannelHandlerContext arg0, Object msg) throws Exception {super.channelRead(arg0, msg);}Overrideprotected void channelRead0(ChannelHandlerContext context, StringMessage data) {logger.info(数据内容data data);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}StringMessage msg StringMessage.create(1,1);msg.setStatusCode(202);msg.setBody(你好我是eric);// msg \r\n;context.channel().writeAndFlush(msg);logger.info(向服务器发送消息 {},msg);}Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {logger.info(客户端连接建立);super.channelActive(ctx);}Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {logger.info(客户端连接断开);super.channelInactive(ctx);}}全部源码详见 gitee : eternity-online: 多人在线mmo游戏 - Gitee.com 分支step-06
http://www.w-s-a.com/news/246159/

相关文章:

  • seo网站培训优化怎么做如何给网站做下载附件
  • php网站建设文献综述怎么样提高网站排名
  • 专用车网站建设wordpress半透明
  • 石狮网站建设哪家好wordpress 3.9 漏洞
  • 为何建设单位网站找网络推广策畿
  • 用网站模板做网站动漫制作专业学校前十名
  • 网页 代码怎么做网站网站建设与维护课程设计
  • 网站制作哪家公司好企业名录联系电话
  • 做的网站怎么上传到网上wordpress图片之间空一行
  • 腾讯云建设网站视频vi报价单
  • 个人网站发布怎么做建设银行网站收款怎么打明细
  • 网站整体色调网站建设都有什么类型
  • 比较简洁大方的网站软件工程四大方向
  • 大家称赞的网站建设常德小学报名网站
  • 做网站怎么建文件夹百度网盘搜索神器
  • 企业有域名怎么做网站淘宝推广平台
  • 学网站开发去哪学药品销售推广方案
  • 哔哩哔哩h5播放器深圳网站seo外包公司哪家好
  • asp做的手机网站wordpress 文章title
  • 网站验证码目录wordpress内嵌播放器
  • 文明网网站建设南昌市建设规费标准网站
  • 安康有建网站的公司吗做网站用什么网名好
  • 济南网站制作哪家专业西安市城乡建设网官方网站
  • 网站建设有趣小游戏怎样让网站优化的方式
  • 昭通做网站儿童编程教学入门教程
  • eclipse静态网站开发软文广告投放平台
  • 网站建设教学视频济南做网站需要多少钱
  • 网站免费做软件市工商联官方网站建设方案
  • 网站建设大体包含英铭长沙网站建设
  • 网站建设培训学校北京如何搜索网站