Netty+websocket的客服聊天室

时间:2020-12-07 19:58:43

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

目录结构
Netty+websocket的客服聊天室

详解
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