1. 程式人生 > >Netty+websocket的客服聊天室

Netty+websocket的客服聊天室

Netty所需jar包
commons-beanutils-1.8.0.jar
commons-collections-3.2.jar
commons-logging.jar
commons-lang-2.4.jar
ezmorph-1.0.6.jar
json-lib-2.4-jdk15.jar 這裡使用org.
log4j-1.2.17.jar
netty-all-4.1.6.Final.jar

系統概要(懶得做圖就看文字吧)
1. 使用者通過websocket與netty建立通訊
2. 使用者連結到伺服器佇列中
3. 佇列通過輪訓機制判定netty是否有可以服務的客服
4. 如果有則將佇列中的使用者channel轉給客服進行點對點通訊
5. 佇列有自己的最大容載量
6. 每個客服可以同時服務N個使用者
7. 沒有空閒客服的時候使用者們只能在佇列中慢慢排隊
8. 佇列狀態及實時位置由佇列向佇列內使用者推送
9. 當有空閒位置的時候,輪訓機制會將佇列中首位使用者放到netty中進行與客服的通訊掛鉤
10. 其實對於伺服器佇列可以抽出來做到一個單獨的專案中,使用者先訪問佇列專案,佇列專案再將使用者channel傳送給處理訊息的netty專案

這個demo僅供學習使用,對於粘包可以自行處理(緩衝區及LineBasedFrameDecoder的使用),對於新的需求迭代參考MsgExecute.java ,對於持久化操作參考DbService.java

目錄結構
這裡寫圖片描述

詳解
1. StartMsgService 服務啟動入口
2. IniConf 提供了配置初始化
3. ServerLog 日誌輸出
4. WebSocketHandler websocket格式認證
5. Server Netty主服務
6. MsgHandler 主事件服務
7. MsgExecute

訊息分流
8. ServerThread 客服佇列,server佇列
9. DbService 持久層操作,寫了一個demo
10. ContainerChange 專用容器清空類
11.Msg 傳送訊息json處理
12. Join 進入聊天室json處理
13.Create 成功連線伺服器json處理
14. UserServerPojo 一個萬能的Pojo
15. Type 包裝了Log型別
16. SysCode 系統異常
17. JSONtype json資料型別
18. Data 全域性資料

Type.java

/**
* 關於這裡我要說一下本來想把資料型別,log型別都裝箱的。
* 後來覺得自己用的例子,而且裝箱後json反覆對使用者聊天的info進行比對也是蠻不舒服的,而且我這個也不算是對外的服務專案,索性後面就用普通方式定義了
* Type如果大家覺得變扭就刪了吧
* 關於Type裝箱請見:
* http://blog.csdn.net/crazyzxljing0621/article/details/53201103 
* 檢視SvnConfig.java 畢竟這個是定位為一個工具包來製作的
*/

public final class Type {
    private String val;

    public String getVal() {
        return val;
    }

    private Type() {
    }

    private Type(String val) {
        this.val = val;

    } 
    /**
     * 日誌型別
     */
    public final static Type ERROR=new Type("[ERROR]:");
    public final static Type INFO=new Type("[INFO]:");  

}

index.html

<script type="text/javascript">   
        var socket; 
        if (!window.WebSocket) {
            window.WebSocket = window.MozWebSocket; 
        } 
        if (window.WebSocket) {  
            //建立連線例項
            socket = new WebSocket("ws://localhost:5544/ws");  
            socket.onmessage = function(event) { 
                //得到訊息
            }; 
            socket.onopen = function(event) { 

                // 連線開啟
            };  
            socket.onclose = function(event) {
                //伺服器關閉
            };
        } else {
            //ie8不相容使用 flash進行通訊
            //....
        } 
        function send() {
            if (!window.WebSocket) {
                return;
            }
            if (socket.readyState == WebSocket.OPEN) {
                socket.send("我要發個json,因為我伺服器是json來接收");
            } else {
                //伺服器關閉
            }   
        }    

    </script>   
//程式碼有註釋,可直接執行.
//上面的js和callServer可以直接進行通訊
//html頁面沒有過多程式碼,直接根據不同事件監聽返回值就行了
//一個自己熟悉netty的小例子
//Netty博大精深繼續學習中,不是單純做幾個例子或完成幾個指定需求就可以吃透的