自定義基于TCP的應(yīng)用層通信協(xié)議。實(shí)現(xiàn)客戶(hù)端對(duì)服務(wù)器的遠(yuǎn)程調(diào)用
編寫(xiě)服務(wù)器及客戶(hù)端代碼
基于TCP的自定義應(yīng)用層協(xié)議
一、請(qǐng)求
1.請(qǐng)求格式
type:哪個(gè)方法
length:payload的長(zhǎng)度
payload:調(diào)用的方法的參數(shù)
2.創(chuàng)建Request類(lèi)
二、響應(yīng)
1.響應(yīng)格式
type:哪個(gè)方法
length:payload的長(zhǎng)度
payload:調(diào)用的方法的結(jié)果
2.創(chuàng)建Response類(lèi)
三、客戶(hù)端-服務(wù)器交互
四、type
- 0X1 創(chuàng)建channel
- 0X2 銷(xiāo)毀channel
- 0X3 創(chuàng)建交換機(jī) exchangeDeclare
- 0X4 刪除交換機(jī) exchangeDelete
- 0X5 創(chuàng)建隊(duì)列 queueDeclare
- 0X6 刪除隊(duì)列 queueDelete
- 0X7 創(chuàng)建綁定 queueBind
- 0X8 刪除綁定 queueUnbind
- 0X9 發(fā)布消息 basicPublish
- 0Xa 訂閱消息 basicConsume
- 0xb 確認(rèn)消息 basicAck
- 0xc 服務(wù)器給客戶(hù)端推送消息(響應(yīng)獨(dú)有)
五、請(qǐng)求payload
1.BasicAruguments(方法公共參數(shù))
- rid(一次請(qǐng)求/響應(yīng))
- channelId(一次邏輯上的連接)
2.每個(gè)方法的參數(shù)
需要繼承BasicArguments
ExchangeDelareArguments
ExchangeDeleteArguments
QueueDeclareArguments
QueueDeleteArguments
QueueBindArguments
QueueUnbindArguments
BasicPublishArguments
BasicConsumeArguments
BasicAckArguments
以ExchangeDeclare方法為例,具體的請(qǐng)求格式如下:
六、響應(yīng)payload
1.BasicReturns(返回結(jié)果公共參數(shù))
- rid (一次請(qǐng)求/響應(yīng))
- channelId (一次邏輯上的連接)
- ok (方法運(yùn)行結(jié)果)
以exchangeDeclare為例,具體的響應(yīng)格式:
其他的方法返回的響應(yīng)payload都是BasicReturns序列化后的結(jié)果,除了0xc,是響應(yīng)獨(dú)有的。
2.SubscribeReturns
服務(wù)器通過(guò)Consumer接口實(shí)現(xiàn)推送消息給客戶(hù)端(隊(duì)列收到消息的時(shí)候會(huì)調(diào)用回調(diào)方法)
響應(yīng)具體格式:
編寫(xiě)服務(wù)器代碼
一、創(chuàng)建BrokerServer
二、初始化ServerSocket
給Serversocket初始化,監(jiān)聽(tīng)一個(gè)端口
三、開(kāi)啟服務(wù)器
- 接受客戶(hù)端的連接請(qǐng)求
- 線程池處理連接
四、停止服務(wù)器(便于測(cè)試)
- runnable設(shè)置成false
- 拋棄線程池的所有任務(wù)
- 關(guān)閉ServerSocket服務(wù)器連接
五、處理連接
- 讀取請(qǐng)求并解析
- 根據(jù)請(qǐng)求計(jì)算響應(yīng)
- 將響應(yīng)返回給客戶(hù)端
- 關(guān)閉客戶(hù)端連接
- 清除斷開(kāi)連接的socket的會(huì)話信息(channelId-socket)
1.讀取請(qǐng)求并解析
2.根據(jù)請(qǐng)求計(jì)算響應(yīng)
3.將響應(yīng)返回給客戶(hù)端
4.清除有關(guān)斷開(kāi)連接的socket對(duì)應(yīng)的會(huì)話信息
編寫(xiě)客戶(hù)端代碼
一、ConnectionFactory 連接工廠
- 服務(wù)器地址
- 創(chuàng)建connecion對(duì)象
創(chuàng)建Connection對(duì)象
二、Connection 一次TCP連接
- socket對(duì)象 socket=new socket(host,port)
- 多個(gè)channel 對(duì)象 (創(chuàng)建channel對(duì)象)
- 寫(xiě)入請(qǐng)求
- 讀取響應(yīng)
- 處理響應(yīng)
1.Connection 屬性
2.初始化
3.寫(xiě)入請(qǐng)求
4.讀取響應(yīng)
5.創(chuàng)建channel
6.處理響應(yīng)
此處在構(gòu)造方法中,補(bǔ)充創(chuàng)建一個(gè)掃描線程,當(dāng)連接未斷開(kāi)時(shí),不停的掃描(讀?。┓?wù)器返回的響應(yīng)。處理響應(yīng)。
如果是SubScirbleReturns,使用線程池執(zhí)行消費(fèi)者的回調(diào)。
如果是BasicReturns,將響應(yīng)的basicReturns放入對(duì)應(yīng)channel的basicReturnsMap中。
7.關(guān)閉連接
三、Channel 邏輯上的連接
- 對(duì)應(yīng)API,實(shí)現(xiàn)客戶(hù)端對(duì)服務(wù)器的遠(yuǎn)程調(diào)用
1.屬性
2.API(遠(yuǎn)程調(diào)用服務(wù)器的)
- 構(gòu)造請(qǐng)求
- 寫(xiě)入請(qǐng)求
- 阻塞等待服務(wù)器的響應(yīng)結(jié)果
生成rid:
創(chuàng)建channel
銷(xiāo)毀channel
創(chuàng)建交換機(jī)
刪除交換機(jī)
創(chuàng)建隊(duì)列
刪除隊(duì)列
創(chuàng)建綁定
刪除綁定
發(fā)布消息
訂閱消息
確認(rèn)消息
3.實(shí)現(xiàn)阻塞等待服務(wù)器的響應(yīng)
waitResult
根據(jù)rid,在basicReturnsMap集合中找;如果找到了,就返回,找不到阻塞等待。
putResult
將rid-basicReturns 放入basicReturnsMap集合中
編寫(xiě)Demo
實(shí)現(xiàn)消息隊(duì)列生產(chǎn)者-消費(fèi)者模型。
1.生產(chǎn)者客戶(hù)端
2.消費(fèi)者客戶(hù)端
測(cè)試
1. 啟動(dòng)服務(wù)器
2.啟動(dòng)生產(chǎn)者
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-705035.html
3.啟動(dòng)消費(fèi)者
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-705035.html
到了這里,關(guān)于基于RabbitMQ的模擬消息隊(duì)列之六——網(wǎng)絡(luò)通信設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!