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

Netty4.1 API
http://netty.io/4.1/api/index.html

目錄結構
這裏寫圖片描述

詳解
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博大精深繼續學習中,不是單純做幾個例子或完成幾個指定需求就可以吃透的

代碼下載地址csdn
http://download.csdn.net/detail/crazyzxljing0621/9713354

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章