? ? ? 前些天,在項(xiàng)目測試時(shí)遇到一個(gè)bug,即IOS客戶端傳輸給服務(wù)端數(shù)據(jù)時(shí),時(shí)而成功,時(shí)而失敗,并導(dǎo)致客戶端與服務(wù)端斷開連接,不接收任何消息。后來打印 websocket的關(guān)閉原因,才知道是傳輸?shù)南⑦^長導(dǎo)致。
? ? ? 通過在網(wǎng)上查找資料,才知道websocket的文本消息傳輸,協(xié)議允許的長度不超過127,那么,對(duì)于超出范圍的消息又怎么進(jìn)行傳輸呢?對(duì)此,網(wǎng)友給出的答案,采用自定義協(xié)議、消息分片發(fā)送、改websocket為長連接或輪訓(xùn);思量下來,還是決定采用消息分片處理的方式來處理消息。
? ? 首先,我們要自定義一個(gè)消息處理器,實(shí)現(xiàn)MessageHandler.Partial接口,MessageHandler接口中有兩個(gè)接口,一個(gè)是Partial,另一個(gè)是Whole接口,Partial用于接收部分消息,Whole用于一次性接收一條完整的消息。實(shí)現(xiàn)代碼如下:

? ? 上面代碼中的last參數(shù)是一個(gè)結(jié)束傳輸?shù)臉?biāo)識(shí),如果消息是最后一條消息,則last為true,當(dāng)客戶端分片發(fā)送消息時(shí),服務(wù)端接收消息會(huì)不斷的調(diào)用 onMassege方法。另外,當(dāng)自定義的消息處理器完成后,我們還需要對(duì)該處理器在session中注冊,即在@OnOpen修飾的方法中添加:? ? ? ? ? ? ?session.addMessageHandler(new LangTextHandle(session,serial));
鑒于本人文筆有限,請多多包涵,如有需要查詢更詳細(xì)的資料原文資料,請移步此處。