第一步:连接监听器在连接成功后,发送授权信息
<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);
到此,整个客户端的连接,消息请求,转发,返回流程走完。。。。
原文:https://www.cnblogs.com/lufengwode/p/13359704.html