12 4 客戶端響應解碼

2021-09-07 16:18:50 字數 3328 閱讀 6915

客戶端響應解碼整體流程:

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 服務端請求解碼 極其相似。

不同的地方是:

1

protected 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:

1

public 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上執行的應用程式,使用者可以檢視並運算元據 處理一些或所有的業務規則 同時提供乙個豐富的使用者介面做出響應。伺服器負責管理對資料的訪問並負責執行一些...