一個粗糙的,發上來都以爲很羞恥的,使用vue ,netty 基於websocket的 即時通信系統。
github: github.com/wangkeshan9…
site: http://47.105.88.240:8080/前端
private String command;
private String traceId;
private Object data;
複製代碼
command 表示數據包指令類型,
由於websocket協議是全雙工,並不能像http協議同樣一問一答的形式,因此對於client,在原生協議上沒法連接一個request和一個response,因此使用traceId來判斷,
data爲數據vue
若是是一問一答的須要traceId 的應答模式,則對req,以及對應的回調方法打包進隊列,若是resp迴應,則回調處理
若是是單向的,則根據command 來找到註冊的處理方法處理java
handler:git
pipeline.addLast(new IMIdleStateHandler()); //空閒鏈接處理,超時則關閉
pipeline.addLast(new HttpServerCodec());//http協議編解碼器
pipeline.addLast(new HttpObjectAggregator(65536)); //聚合 htp requet中的chunk內容,
pipeline.addLast(new ChunkedWriteHandler());//聚合response中的大量數據內容
pipeline.addLast(new WebSocketServerCompressionHandler());//處理websocket的擴展以及判斷協議升級
pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true));//會自動添加websocket握手handler,握手完成會添加websocket的編解碼器
pipeline.addLast(new HttpStaticFileServerHandler());//靜態頁面服務,
pipeline.addLast(new WebSocketFrameHandler()); //業務流程的開始
複製代碼
業務方法舉例:github
@Command(ADD_FRIENDS)
public class AddFriendsService extends BaseService<AddFriendReq, AddFriendResp> {
@Override
AddFriendResp process(MsgContext context, AddFriendReq addFriendReq) {
UserService.addFriend(addFriendReq.getUserId(), addFriendReq.getAddId());
//響應被添加者
UserInfo userInfo = UserService.getUserInfo(addFriendReq.getUserId());
Packet p = new Packet(ADD_NOTIRY, null, new AddFriendNotify(userInfo.getUserId(), userInfo.getUserName()));
UserInfo addedUserInfo = UserService.getUserInfo(addFriendReq.getAddId());
send(addedUserInfo.getChannel(), p);
return new AddFriendResp("SUCCESS", "SUCCESS", addedUserInfo.getUserId(), addedUserInfo.getUserName());
}
}
複製代碼
@Command爲自定義註解,標註處理的command類型,泛型爲req,resp的類型,web
前端: vue ui直接打包 後端: java -jar -Dfront_dir=E:\code\Netty_IM\front\im_ui\dist -Dport=8080 netty_im-1.0.jar front_dir 爲前端目錄 portchrome
其實看起來徹底就是個粗糙的玩具,列一些後續能夠繼續作的方向吧,雖然我這麼懶估計也不會去作json