利用飛鴿協議實現通訊功能
一、飛鴿協議的格式:版本號:包編號:傳送者名字:傳送者主機名:命令字:附加資訊
二、IPMSG的主要功能:區域網通訊、傳輸檔案、傳輸資料夾、通過新增區域網外IP來實現網外的聊天與檔案傳輸功能。
主要優點:可以執行與兩個不同平臺的程式之間通訊;
不需要伺服器進行轉發;
屬於應用層協議,描述了飛鴿程式通訊時的語法和語義;
三、飛鴿協議的用法:按飛鴿協議的格式封裝DatagramPacket(資料包),再通過DatagramSocket傳送給對方,接收端同樣按飛鴿協議的格式解析資料包,進行資料操作,實現通訊。
四、IPMSG上線流程:
首先傳送IPMSG_NOOPERATION,預設是不做任何處理,然後上線通告報文IPMSG_BR_ENTRY。每次IPMSG在收到上線報文後,都要查詢相同IP的節點是否已經存在,只要和Java Bean物件中hostIP比較就可以了,這樣整個使用者列表當中的成員是不會重複的。
傳送上線報文1:XXX:使用者名稱:主機名:IPMSG_BR_ENTRY:使用者名稱 + “\0” + 組名
五、IPMSG離線流程:
傳送離線報文1:XXX:使用者名稱:主機名:IPMSG_BR_EXIT:
六、IPMSG聊天功能的流程:
預設使用2425埠做資料傳輸(TCP/UDP)
IPMSG通過UDP協議實現聊天,當一個IPMSG客戶端執行開始,首先它向整個區域網廣播上線報文,區域網內的其他IPMSG客戶端收到上線報文後,回覆該報文,回覆報文中包含了該客戶端的IP、PORT、使用者名稱、機器名,其中IP地址在UDP協議的通訊包裡自動新增,其他資訊需要根據飛鴿協議手動新增到DatagramPacket。這樣在上線客戶端通過廣播傳送上線報文後,區域網內的其他所有IPMSG客戶端都傳送一個回覆報文,這樣,所有IPMSG的客戶端都更新自己的線上使用者列表。這樣IPMSG的上線就算結束了。
七、傳送訊息的流程:
客戶端傳送訊息通過UDP來完成,客戶端通過查詢自己的使用者列表獲取其他使用者的網路地址資訊,傳送訊息給其他使用者。使用IPMSG_SENDMSG命令傳送訊息,訊息內容新增在附加資訊中;在接收訊息時,如果對方要求回信確認(IPMSG_SENDCHECKOPT位開啟),則需要傳送IPMSG_RECVMSG命令,並將對方傳送的資料包的編號放在附加資訊中一同傳送至傳送訊息方。[注:我就發現在這裡發現包編號的用圖]
由於UDP的不可靠性,所以就要要求接收方回覆回執資訊。
1:XXX:使用者名稱:主機名:IPMSG_SEND_MSG|IPMSG_SENDCHECKOPT選項,就要立即回覆如下資訊1:XXX:使用者名稱:主機名:IPMSG_RECVMSG:接收到的包編號
八、對命令字的解析:
報文中的命令字是一個32位無符號整數,包含命令(最低位元組)和選項(高三位元組)兩部分。所以在接收到報文後就要解析命令欄位的低八位,過濾方法:命令欄位 & 0XFF = 飛鴿協議定義的命令
(1)帶有BR標識的為廣播命令
IPMSG_NOOPERATION 不進行任何操作
IPMSG_BR_ENTRY 使用者上線
IPMSG_BR_EXIT 使用者退出
IPMSG_ANSENTRY 通報線上
IPMSG_SENDMSG 傳送訊息
IPMSG_RECVMSG 通報收到訊息
IPMSG_GETFILEDATA 請求通過TCP傳輸檔案
IPMSG_RELEASEFILES 停止接收檔案
IPMSG_GETDIRFILES 請求傳輸資料夾
九、處理附加欄位多餘的分隔符“:”
把接收到的DatagramPacket中取出date欄位,將資料使用split(“:”)進行切割,放入String[]中,把String[5]開始的資料拼接起來,組成附加欄位的全部資訊。
十、檔案傳輸
帶有IPMSG_FILEATTACHOPT位的IPMSG_SENDMSG命令可用來傳輸檔案,檔案屬性及內容新增在附加資訊中,檔案內容新增在訊息內容後並以“\0”分隔開。
通過UDP報文聯絡,在UDP報文聯絡好之後,隨即發起TCP檔案傳輸,檔案傳輸是不帶格式的。
具體步驟:
1、傳送端傳送一個UDP資料包,通知接收端準備接收檔案,通知在一個socket上監聽TCP連線事件;
2、接收端回發一個UDP資料包,告訴傳送端已準備好接收資料,並請求一個TCP的連線;
3、傳送端接收連線的請求,並將檔案對映到記憶體中,然後建立傳送檔案執行緒,開始進行資料的傳送;
4、接收端建立接收的檔案,然後建立接收資料的執行緒,開始收取資料,接收完以後,將資料寫入到建立好的檔案中。
我已按飛鴿協議的規則整合了一個程式碼庫,可以直接整合到你的工程中,快速利用飛鴿傳書實現通訊功能。已開源【由於時間較短,難免有Bug,還望指正】
程式碼庫和使用Demo下載傳送門https://yunpan.cn/cqt8EVUM3hJJM 訪問密碼 2a2b
參考網站:
飛鴿傳書協議官網:http://ipmsg.org/index.html.en
飛鴿傳書協議(翻譯稿)http://www.cnblogs.com/hnrainll/archive/2011/05/07/2039567.html
相關文章
- 如何利用 Netty 實現自定義協議通訊?Netty協議
- Linux中利用NFS實現飛鴿傳書LinuxNFS
- RPC框架實現 - 通訊協議篇RPC框架協議
- 通訊協議protobuf的原理與實現協議
- 飛鴿傳書實現原理
- zmq通訊協議的實現,又稱zeromqMQ協議
- QT使用 http 協議通訊的實現示例QTHTTP協議
- 通訊協議協議
- Redis 通訊協議Redis協議
- HTTP通訊協議HTTP協議
- Mysql通訊協議MySql協議
- MQ通訊協議MQ協議
- web通訊協議Web協議
- Linux Shell 指令碼實現 tcp/upd 協議通訊Linux指令碼TCP協議
- 基於Netty實現自定義訊息通訊協議(協議設計及解析應用實戰)Netty協議
- 利用SQL實現通訊錄SQL
- 網路通訊協議協議
- Dubbo-通訊協議協議
- 串列埠通訊協議串列埠協議
- 如何動手實現一個自定義的通訊協議?協議
- MQTT物聯網通訊協議入門及Demo實現MQQT協議
- 使用go net實現簡單的redis通訊協議YWSVGoRedis協議
- C#實現聯通簡訊Sgip協議程式原始碼C#協議原始碼
- 網路通訊協議-ICMP協議詳解!協議
- 網路通訊協議-TCP協議詳解!協議TCP
- 網路通訊協議-HTTP協議詳解!協議HTTP
- 網路通訊協議-SMTP協議詳解!協議
- 用隧道協議實現不同dubbo叢集間的透明通訊協議
- 輕量通訊協議 --- MQTT協議MQQT
- HTTP協議的通訊框架HTTP協議框架
- WLAN常用的通訊協議協議
- 通訊協議:HTTP、TCP、UDP協議HTTPTCPUDP
- 15. SPI通訊協議協議
- IIC通訊協議筆記協議筆記
- SPI通訊協議筆記協議筆記
- 基於 Netty 的可插拔業務通訊協議的實現「1」協議描述及基本訊息物件設計Netty協議物件
- Python 基於 TCP 傳輸協議的網路通訊實現PythonTCP協議
- 倍福ADS協議通訊協議