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

html5手机资讯网站模板区块链交易网站建设

html5手机资讯网站模板,区块链交易网站建设,做网站维护要学些什么·,经典软文案例100例说明 使用Netty框架构建的socket服务端在处理客户端请求时,每接到一个客户端的连接请求,服务端会分配一个channel处理跟该客户端的交互。如果处理该channel数据的ChannelHandler抛出异常没有捕获,那么该channel会关闭。但服务端和其它客户端…

说明

使用Netty框架构建的socket服务端在处理客户端请求时,每接到一个客户端的连接请求,服务端会分配一个channel处理跟该客户端的交互。如果处理该channel数据的ChannelHandler抛出异常没有捕获,那么该channel会关闭。但服务端和其它客户端的通信不受影响。

代码示例

该示例验证场景:
服务端和客户端建立了正常的连接,服务端给该客户端分配了一个channel。从该channel读取数据的ChannelHandler抛出异常,没有被捕获,导致该channel被关闭,服务端和该客户端的通信中断。但服务端和其它客户端的通信不受影响。

服务端代码片段

package com.thb.power.server;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;/*** 服务端的主函数* @author thb**/
public class MainStation {private static final Logger logger = LogManager.getLogger();static final int PORT = Integer.parseInt(System.getProperty("port", "22335"));public static void main(String[] args) throws Exception {logger.traceEntry();// 配置服务器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 MainStationInitializer());// 启动服务端ChannelFuture f = b.bind(PORT).sync();// 等待直到server socket关闭f.channel().closeFuture().sync();} finally {// 关闭所有event loops以便终止所有的线程bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}logger.traceExit();}}
package com.thb.power.server;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import com.thb.power.constant.PowerConstants;
import com.thb.power.handler.VerifyChecksumHandler;import io.netty.buffer.Unpooled;
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.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;public class MainStationInitializer extends ChannelInitializer<SocketChannel> {private static final Logger logger = LogManager.getLogger();@Overridepublic void initChannel(SocketChannel ch) throws Exception {logger.traceEntry();ChannelPipeline p = ch.pipeline();		 p.addLast(new LoggingHandler(LogLevel.INFO));// 用报文开头的字符、结尾的字符作为分隔符,解析成完整的报文	p.addLast(new DelimiterBasedFrameDecoder(PowerConstants.SOCKET_MAX_BYTES_PER_PACKET, true, Unpooled.wrappedBuffer(new byte[] {PowerConstants.SOCKET_END_MARK}),Unpooled.wrappedBuffer(new byte[] {PowerConstants.SOCKET_START_MARK})));	p.addLast(new VerifyChecksumHandler());logger.traceExit();}
}
package com.thb.power.handler;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.CorruptedFrameException;
import io.netty.util.ReferenceCounted;/*** 验证接收的报文的校验和* @author thb**/
public class VerifyChecksumHandler extends ChannelInboundHandlerAdapter {private static final Logger logger = LogManager.getLogger();@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {logger.traceEntry();		if (msg instanceof ByteBuf) {ByteBuf m = (ByteBuf)msg;logger.info("msg reference count: {}", m.refCnt());// 此处人为构造场景,以便验证抛出异常的情况。将引用计数减少1,执行后,引用计数变为0,读数据会抛异常m.release();m.readByte();logger.info("readableBytes: " + m.readableBytes());		// 将收到的报文的每个字节转换为十六进制打印出来			logger.info(ByteBufUtil.prettyHexDump(m));			} else {// 这个数据不需要向后传递,因为数据已经错误了// 传入的对象msg如果实现了ReferenceCounted接口,那么显式就释放if (msg instanceof ReferenceCounted) {((ReferenceCounted)msg).release();}throw new CorruptedFrameException("received illegal data: not ByteBuf type");}logger.traceExit();}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace();ctx.close();}
}
package com.thb.power.constant;/*** 保存了一些常数* @author thb**/
public final class PowerConstants {/*** 定义了私有构造函数,防止被外部实例化*/private PowerConstants() {}/*** 通信报文的起始符*/public static final byte SOCKET_START_MARK = (byte)0x68;/*** 通信报文的的结束符*/public static final byte SOCKET_END_MARK = (byte)0x16;/*** 每个报文的最大字节数*/public static final short SOCKET_MAX_BYTES_PER_PACKET = 1024;
}

启动服务端

在这里插入图片描述

启动客户端,并向服务端发送数据

在这里插入图片描述
在这里插入图片描述

服务端的ChannelHandler处理数据时抛出了异常,断开了和该客户端的连接

在这里插入图片描述
在这里插入图片描述
从输出可以看出,服务端处理客户端channel数据的ChannelHandler抛出了异常,服务端终止了和该客户端的连接。

观察客户端的输出

在这里插入图片描述
从输出可以看出,客户端终止了和服务端的连接。

服务端可以继续接受新的客户端连接

在这里插入图片描述
从输出可以看出,服务端可以正常接受新的客户端的连接

http://www.yayakq.cn/news/496508/

相关文章:

  • 江都建设上海公司网站顺德网站建设基本流程
  • 网站建设文字表达企业邮箱在哪里登陆
  • 电子商务网站建设教学计划网站建设服务怎么样
  • 怎么在DW网站站点下建立两张网页兰州市生态建设管理局网站
  • 网站dns如何修改不了同江佳木斯网站制作
  • mvc中手把手做网站固原建设厅官方网站
  • 无锡网站推广排名鱼巴士设计师服务平台
  • 网站开发现在怎么样网页设计网站首页代码
  • 外贸邦海关数据手机网站seo免费软件
  • linux网站开发呼和浩特网站建设价位
  • 怎么样利用一些网站开发客户微信网站后期运营怎么做
  • 网站备案查询 优帮云wordpress 主题文件
  • 农产品信息网站的建设wordpress 被入侵 删文章
  • 公网ip 做网站深圳文化墙制作公司
  • 川制作官方网站网络舆情平台
  • 甘肃省水利工程建设网站wordpress游戏资讯
  • 那些网站hr可以做兼职seo短视频网页入口引流方法
  • 广州网站排名优化服务大型网站开发团队的美工需要什么工作经验和教育背景及薪酬
  • 红色门户网站个人网站备案麻烦
  • 平面设计就业方向有哪些镇江seo
  • 怎么制作一个网站内容网站域名301重定向
  • 附近的网站建设公司微信内转发的网页怎么制作
  • 网站深圳企业门户网站
  • 个人网站备案出现公司名字怎么办响应式网站效果图做多大的
  • 代做企业网站备案洛阳建站优化教程
  • 网站主要的设计内容主题国际十大公关公司
  • wap网站制作工具网站建设有哪些效益
  • 网站标题title凡科建站电脑版网址
  • 彩票网站如何做福州网站建设设计公司
  • 北京网站模板下载企业商城建站