客戶端響應解碼整體流程:
1 nettycodecadapter$internaldecoder.decode(channelhandlercontext ctx, bytebuf input, listout)2 -->new nettybackedchannelbuffer(bytebuf buffer) //
建立乙個buffer
3 -->nettychannel.getoraddchannel(io.netty.channel.channel ch, url url, channelhandler handler)
4 -->dubbocountcodec.decode(channel channel, channelbuffer buffer)
5 -->exchangecodec.decode(channel channel, channelbuffer buffer)
6 -->buffer.readbytes(header); //
讀取header byte
7 -->decode(channel channel, channelbuffer buffer, int readable, byte
header)
8 -->檢查魔數、檢查總長度是否大於等於16
9 -->獲取請求體長度
10 -->new
channelbufferinputstream(buffer, len)
11 -->dubbocodec.decodebody(channel channel, inputstream is, byte
header)
12 -->codecsupport.getserialization(url url, byte id) //
解析出請求頭header[2]中的序列化id,根據該id獲取與請求編碼相同的序列化協議
13 -->bytes.bytes2long(header, 4) //
獲取respid
1415 -->new decodeablerpcresult(channel channel, response response, inputstream is, invocation invocation, byte
id)16 -->decodeablerpcresult.decode()
17 -->decode(channel channel, inputstream input) //
解析請求體引數並將其構造為乙個decodeablerpcresult,最終塞到request物件的data屬性中
18 -->new
hessian2objectinput(inputstream is)
19 -->反序列化:in.readobject()
與 12.2 服務端請求解碼 極其相似。
不同的地方是:
1protected object decodebody(channel channel, inputstream is, byte header) throws
ioexception
12//
get status.
13byte status = header[3];
14res.setstatus(status);
15if (status ==response.ok) else
if(res.isevent()) else
else
35data = result;36}
37res.setresult(data);
38 } catch
(throwable t)
42res.setstatus(response.client_error);
43res.seterrormessage(stringutils.tostring(t));44}
45 } else
48return
res;
49 } else
57try
else
if(req.isevent()) else
else
74 data =inv;75}
76req.setdata(data);
77 } catch
(throwable t)
81//
bad request
82 req.setbroken(true
);83
req.setdata(t);84}
85return
req;86}
87}8889
private
objectinput deserialize(serialization serialization, url url, inputstream is)
90throws
ioexception
9394
private
byte readmessagedata(inputstream is) throws
ioexception
100return
newbyte
{};101 }
decodeablerpcresult:
1public object decode(channel channel, inputstream input) throws
ioexception catch
(classnotfoundexception e)
18break;19
case
dubbocodec.response_with_exception:
20try
catch
(classnotfoundexception e)
28break;29
default:30
throw
new ioexception("unknown result flag, expect '0' '1' '2', get " +flag);31}
32return
this
;33 }
setvalue:設定decodeablerpcresult的object result屬性。
響應解碼結束。
1 2 4寫乙個 echo 客戶端
客戶端要做的是 跟寫伺服器一樣,我們提供 channelinboundhandler 來處理資料。下面例子,我們用 channelinboundhandler 來處理所有的任務,需要覆蓋三個方法 listing 2.4 channelhandler for the client sharable 1...
hbase客戶端連線沒響應
初學hbase時,遇到乙個很奇怪的問題。用eclipse去連hbase時,一直沒響應,也沒有報錯。然後去上網查了,需要在hosts檔案中配置,ip和主機名的對映配置.配置zk使用主機名,但是試過,還是沒響應。而且也能ping通zk位址。試了幾天,都很絕望。後來,發現hbase的埠是不通的,後來試著關...
瘦客戶端 胖客戶端 智慧型客戶端
胖客戶端模式將應用程式處理分成了兩部分 由使用者的桌面計算機執行的處理和最適合乙個集中的伺服器執行的處理。乙個典型的胖客戶端包含乙個或多個在使用者的pc上執行的應用程式,使用者可以檢視並運算元據 處理一些或所有的業務規則 同時提供乙個豐富的使用者介面做出響應。伺服器負責管理對資料的訪問並負責執行一些...