一個使用vue,netty基於websocket的即時通信玩具

一個粗糙的,發上來都以爲很羞恥的,使用vue ,netty 基於websocket的 即時通信系統。
github: github.com/wangkeshan9…
site: http://47.105.88.240:8080/前端

使用示例

  • !!!最好是使用手機,若是是PC瀏覽器,建議使用chrome,而後打開F12 ,而後ctrl+shift+m 進入手機設備模擬,不然右滑添加好友操做沒法完成!!!

主要結構

數據包結構爲json形式:

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

TODO

其實看起來徹底就是個粗糙的玩具,列一些後續能夠繼續作的方向吧,雖然我這麼懶估計也不會去作json

  1. netty 用起來仍是有點太底層了,靜態服務器的代碼都要本身找,因此能夠考慮換成vertx,比較小清新,還能作集羣
  2. 想作一個壓測工具,來壓測下性能,
  3. ssl的支持,
相關文章
相關標籤/搜索