首页 > 其他 > 详细

Hclient分析

时间:2020-07-22 14:40:44      阅读:76      评论:0      收藏:0      [点我收藏+]

第一步:连接监听器在连接成功后,发送授权信息

<HolerMsg [type=1, serialNumber=0, uri=fd2c2ef0a0ed4b5695bbfd4b521977fa, data=null]>

第二步:连接授权信息发送成功后,会收到服务器端消息,相当于心跳(消息体为空,不做任何处理)

<HolerMsg [type=7, serialNumber=0, uri=, data=]>

第三步:客户端handler会收到服务端下发的连接信息,告知客户端连接到本地服务器的哪里

 <HMsg [type=3, serialNumber=0, uri=159, data=127.0.0.1:8080]>

客户端handle收到这个消息,会按消息类型处理,解析 url,端口,并获取到ClientContainer 初始化时的intraServer,

用这个Bootstrap 连接到下发的url,端口

第四步:客户通过公网服务器加端口请求服务,服务端监听端口,将请求转发客户端,发送连接信息,平均两秒一次,如

<HolerMsg [type=3, serialNumber=0, uri=173, data=127.0.0.1:8080]>

第五步:客户端handle收到这个消息,会按消息类型处理,解析 url,端口,并获取到ClientContainer 初始化时的intraServer,

用这个Bootstrap 连接到下发的url,端口, 并设置监听器IntraServerListener

第六步:IntraServerListener监听器里面,如果未连接到目标服务,则返回连接断开消息type=4,uri与ClientHandler接收到的连接消息uri保持一一对应

<HolerMsg [type=4, serialNumber=0, uri=179, data=null]>

如果连接到目标服务器成功,

则设置holerChannel属性HOLER_CHANNEL为intraChannel,设置intraChannel属性HOLER_CHANNEL为holerChannel, 

holerChannel.attr(HolerConst.HOLER_CHANNEL).set(intraChannel);
intraChannel.attr(HolerConst.HOLER_CHANNEL).set(holerChannel);

并返回连接消息type=3,

然后设置ClientMgr:

ClientMgr.addIntraServer(this.msg.getUri(), intraChannel);
ClientMgr.setIntraServerUri(intraChannel, this.msg.getUri());

 

第六步: 客户端收到服务端转发的消息请求ClientHandler.channelRead0,type=5

<HolerMsg [type=5, serialNumber=0, uri=195, data=GET / HTTP/1.1

<HolerMsg [type=5, serialNumber=0, uri=196, data=GET /bsonp/vendor/jquery-ui/themes/smoothness/j...]>

handleTransferMsg 方法里面,通过clientChannel.attr(HolerConst.HOLER_CHANNEL).get() 方法获取到intraChannel,然后通过intraChannel将消息转发给目标服务

ByteBuf buf = allocator.buffer(msg.getData().length);
buf.writeBytes(msg.getData());
intraChannel.writeAndFlush(buf);

第七步:目标服务获取到转发的http请求,返回消息,IntraServerHandler通过 channelRead0 方法获取到返回消息,通过intraChannel.attr(HolerConst.HOLER_CHANNEL).get()

获取到holerChannel, 然后通过该channel返回转发消息,类型type=5,并且通过ClientMgr 获取到chennel对应的uri

HolerMsg hmsg = new HolerMsg();
hmsg.setType(HolerMsg.TYPE_TRANSFER);

hmsg.setUri(ClientMgr.getIntraServerUri(intraChannel));
hmsg.setData(data);

 

到此,整个客户端的连接,消息请求,转发,返回流程走完。。。。

 

Hclient分析

原文:https://www.cnblogs.com/lufengwode/p/13359704.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!