java_websocket.jar
②在线聊天服务池类(在线用户管理)
package com.kentra.plugin.websocketOnline;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.java_websocket.WebSocket;
/**
* 在线聊天服务池类(在线用户管理)
* @author KENTRASOFT
* QQ 313596790
* 2015-5-25
*/
public class OnlineChatServerPool {
private static final Map<WebSocket,String> userconnections = new HashMap<WebSocket,String>();
private static WebSocket fhadmin = null;;
/**
* 获取用户名
* @param session
*/
public static String getUserByKey(WebSocket conn){
return userconnections.get(conn);
}
/**
* 获取在线总数
* @param
*/
public static int getUserCount(){
return userconnections.size();
}
/**
* 获取WebSocket
* @param user
*/
public static WebSocket getWebSocketByUser(String user){
Set<WebSocket> keySet = userconnections.keySet();
synchronized (keySet) {
for (WebSocket conn : keySet) {
String cuser = userconnections.get(conn);
if(cuser.equals(user)){
return conn;
}
}
}
return null;
}
/**
* 向连接池中添加连接
* @param inbound
*/
public static void addUser(String user, WebSocket conn){
userconnections.put(conn,user); //添加连接
}
/**
* 获取所有的在线用户
* @return
*/
public static Collection<String> getOnlineUser(){
List<String> setUsers = new ArrayList<String>();
Collection<String> setUser = userconnections.values();
for(String u:setUser){
setUsers.add(u);
}
return setUsers;
}
/**
* 移除连接池中的连接
* @param inbound
*/
public static boolean removeUser(WebSocket conn){
if(userconnections.containsKey(conn)){
userconnections.remove(conn); //移除连接
return true;
}else{
return false;
}
}
/**
* 向特定的用户发送数据
* @param user
* @param message
*/
public static void sendMessageToUser(WebSocket conn,String message){
if(null != conn){
conn.send(message);
}
}
/**
* 向所有的用户发送消息
* @param message
*/
public static void sendMessage(String message){
Set<WebSocket> keySet = userconnections.keySet();
synchronized (keySet) {
for (WebSocket conn : keySet) {
String user = userconnections.get(conn);
if(user != null){
conn.send(message);
}
}
}
}
public static WebSocket getFhadmin() {
return fhadmin;
}
public static void setFhadmin(WebSocket fhadmin) {
System.err.println("---------------------fhadmin:"+fhadmin.getLocalSocketAddress().toString());
OnlineChatServerPool.fhadmin = fhadmin;
}
}③在线管理类OnlineChatServer
package com.kentra.plugin.websocketOnline;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import net.sf.json.JSONObject;
import org.java_websocket.WebSocket;
import org.java_websocket.framing.Framedata;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
/**
* 在线管理
* @author KENTRASOFT
* QQ 313596790
* 2015-5-25
*/
public class OnlineChatServer extends WebSocketServer{
public OnlineChatServer(int port) throws UnknownHostException {
super(new InetSocketAddress(port));
}
public OnlineChatServer(InetSocketAddress address) {
super(address);
}
/**
* 触发连接事件
*/
@Override
public void onOpen( WebSocket conn, ClientHandshake handshake ) {
}
/**
* 触发关闭事件
*/
@Override
public void onClose( WebSocket conn, int code, String reason, boolean remote ) {
userLeave(conn);
}
/**
* 客户端发送消息到服务器时触发事件
*/
@Override
public void onMessage(WebSocket conn, String message){
message = message.toString();
if(null != message && message.startsWith("[join]")){
this.userjoin(message.replaceFirst("\\[join\\]", ""),conn);
}else if(null != message && message.startsWith("[goOut]")){
this.goOut(message.replaceFirst("\\[goOut\\]", ""));
}else if(null != message && message.startsWith("[fhsms]")){
senFhsms(message.replaceFirst("\\[fhsms\\]", ""));
}else if(null != message && message.startsWith("[leave]")){
this.userLeave(conn);
}else if(null != message && message.startsWith("[count]")){
this.getUserCount(conn);
}else if(null != message && message.startsWith("[KENTRASOFT]")){
OnlineChatServerPool.setFhadmin(conn);
this.getUserList();
}else{
OnlineChatServerPool.sendMessageToUser(conn, message);//同时向本人发送消息
}
}
public void onFragment( WebSocket conn, Framedata fragment ) {
}
/**
* 触发异常事件
*/
@Override
public void onError( WebSocket conn, Exception ex ) {
if( conn != null ) {
}
}
/**
* 用户加入处理
* @param user
*/
public void userjoin(String user, WebSocket conn){
onlineMaganger(1,user,conn);
}
/**
* 通知
* @param user
*/
public static void senFhsms(String user){
JSONObject result = new JSONObject();
result.element("type", "senFhsms");
OnlineChatServerPool.sendMessageToUser(OnlineChatServerPool.getWebSocketByUser(user),result.toString());
}
/*待办消息发送*/
public static void sendNews(String layout,String content,String user){
JSONObject result = new JSONObject();
result.element("type", "senFhsms");
result.element("content", content);
result.element("layout", layout);
OnlineChatServerPool.sendMessageToUser(OnlineChatServerPool.getWebSocketByUser(user),result.toString());
}
/**
* 强制某用户下线
* @param user
*/
public void goOut(String user){
this.goOut(OnlineChatServerPool.getWebSocketByUser(user),"thegoout");
}
/**
* 强制用户下线
* @param conn
*/
public void goOut(WebSocket conn,String type){
JSONObject result = new JSONObject();
result.element("type", type);
result.element("msg", "goOut");
OnlineChatServerPool.sendMessageToUser(conn,result.toString());
}
/**
* 用户下线处理
* @param user
*/
public void userLeave(WebSocket conn){
onlineMaganger(2,null,conn);
}
/**
* 获取在线总数
* @param user
*/
public void getUserCount(WebSocket conn){
JSONObject result = new JSONObject();
result.element("type", "count");
result.element("msg", OnlineChatServerPool.getUserCount());
OnlineChatServerPool.sendMessageToUser(conn,result.toString());
}
/**
* 获取在线用户列表
* @param user
*/
public void getUserList(){
WebSocket conn = OnlineChatServerPool.getFhadmin();
if(null == conn){return;}
JSONObject result = new JSONObject();
result.element("type", "userlist");
result.element("list", OnlineChatServerPool.getOnlineUser());
OnlineChatServerPool.sendMessageToUser(conn,result.toString());
}
/**用户上下线管理
* @param type 1:上线;2:下线
* @param user
* @param conn
*/
public synchronized void onlineMaganger(int type,String user, WebSocket conn){
if(type == 1){
if(null != OnlineChatServerPool.getWebSocketByUser(user)){ //判断用户是否在其它终端登录
this.goOut(OnlineChatServerPool.getWebSocketByUser(user),"thegoout");
}
// else{
// goOut(conn,"goOut");
// }
OnlineChatServerPool.addUser(user,conn); //向连接池添加当前的连接对象
addUserToFhadmin(user);
}else{
OnlineChatServerPool.removeUser(conn); //在连接池中移除连接
this.getUserList();
}
}
/**
* 有用户登录系统,加入在线列表
* @param conn
*/
public void addUserToFhadmin(String user){
WebSocket conn = OnlineChatServerPool.getFhadmin();
if(null == conn){return;}
JSONObject result = new JSONObject();
result.element("type", "addUser");
result.element("user", user);
OnlineChatServerPool.sendMessageToUser(conn,result.toString());
}
}head.js(main.jsp中引入了head.js)
var locat = (window.location+'').split('/');
//console.log("2行:"+window.location) //http://localhost:8081/sirdifoa/index
$(function(){if('main'== locat[3]){locat = locat[0]+'//'+locat[2];}else{locat = locat[0]+'//'+locat[2]+'/'+locat[3];};});
var id; //用户ID
var user = "FH"; //用于即时通讯( 当前登录用户)
var TFHsmsSound = '1'; //站内信提示音效
var websocket; //websocket对象
var wimadress=""; //即时聊天服务器IP和端口
var oladress=""; //在线管理和站内信服务器IP和端口
//初始页面最顶部信息
$(function(){
getHeadMsg();
});
//初始页面信息
function getHeadMsg(){
$.ajax({
type: "POST",
url: locat+'/head/getList.do?tm='+new Date().getTime(),
data: encodeURI(""),
dataType:'json',
cache: false,
success: function(data){
$("#login_user").html('<i class="ace-icon fa fa-cog"></i><span class="head_user"></span>'+data.user.userName+',您好!');//登陆者资料
user = data.user.userName;
id= data.user.id; //用户ID
TFHsmsSound = data.FHsmsSound; //站内信提示音效
wimadress = data.wimadress; //即时聊天服务器IP和端口
oladress = data.oladress; //在线管理和站内信服务器IP和端口
online(); //连接在线
}
});
}
//加入在线列表
function online(){
if (window.WebSocket) {
// console.log(window.WebSocket)
websocket = new WebSocket(encodeURI('ws://'+oladress)); //oladress在main.jsp页面定义
websocket.onopen = function() {
//连接成功(端口连接成功,表示可以传输数据了)
websocket.send('[join]'+user);
// alert("你好,"+user)
};
websocket.onerror = function() {
//连接失败
};
websocket.onclose = function() {
//连接断开
console.log("连接断开")
};
//消息接收
websocket.onmessage = function(message) {
var message = JSON.parse(message.data);
if(message.type == 'goOut'){
$("body").html("");
goOut("1");
}else if(message.type == 'thegoout'){
$("body").html("");
goOut("2");
}else if(message.type == 'senFhsms'){
// alert(message.layout+":"+message.content);
if(message.layout=="mailLayout"){
$("#"+message.layout).html("<span style='color: red;'>邮件("+message.content+")</span>");
/*顶部*/
$("#mailLayout_top").html("<span class='scorool_top'>邮件(<span class='scorool_top'>"+message.content+"</span>)</span>");
}
if(message.layout=="test"){
alert("弹窗通知:"+message.content)
}
if("flowTodo" == message.layout){//待办
if(message.content){
// navTab.closeCurrentTab("flowAuth"+message.content);//手机上处理了,关闭PC页面
//alert(message.content);
//弹出通知提示....
}
//刷新首页我的待办
$("#todoListId").loadUrl("portalmanage/getTodoList.do","",function(){
$('#todoListId').parent().find("[layoutH]").layoutH();
});
//刷新待办列表
navTab.reloadFlag("todolist");
//刷新首页已办
$("#haveTodoList").loadUrl("portalmanage/getHasTodoList.do","",function(){
$('#haveTodoList').parent().find("[layoutH]").layoutH();
});
//刷新我的已办列表
navTab.reloadFlag("haveTodoList");
}
if("informNum" == message.layout){//通知
if(message.content > '0'){//通知数量
/*底部*/
$("#inform_count_a").html("<span style='color: red;'>通知("+message.content+")</span>");
$("#inform_count_a").attr("href",'inform/index.do?pKey=1&key=546&informType=1');
$("#inform_count_a").attr("rel",'inform');
/*顶部*/
$("#inform_count_a_top").html("<span class='scorool_top'>、通知(<span class='scorool_top'>"+message.content+"</span>)</span>");
$("#inform_count_a_top").attr("href",'inform/index.do?pKey=1&key=546&informType=1');
$("#inform_count_a_top").attr("rel",'inform');
}else{
$("#inform_count_a").html("");
$("#inform_count_a_top").html("");
}
}
if("informFileNum" == message.layout){//文件传阅
if(message.content > '0'){//文件传阅数量
/*底部*/
$("#informFile_count_a").html("<span style='color: red;'>传阅("+message.content+")</span>");
$("#informFile_count_a").attr("href",'inform/index.do?pKey=1&key=751&informType=2');
$("#informFile_count_a").attr("rel",'inform');
/*顶部*/
$("#informFile_count_a_top").html("<span class='scorool_top'>、传阅(<span class='scorool_top'>"+message.content+"</span>)</span>");
$("#informFile_count_a_top").attr("href",'inform/index.do?pKey=1&key=751&informType=2');
$("#informFile_count_a_top").attr("rel",'inform');
}else{
$("#informFile_count_a").html("");
$("#informFile_count_a_top").html("");
}
}
}
};
}
}
//下线
function goOut(msg){
window.location.href=locat+"/logout.do?msg="+msg;
}
//去通知收信人有站内信接收
function fhsmsmsg(USERNAME){
var arrUSERNAME = USERNAME.split(';');
for(var i=0;i<arrUSERNAME.length;i++){
websocket.send('[fhsms]'+arrUSERNAME[i]);//发送通知
}
}
//读取站内信时减少未读总数
function readFhsms(){
mailCount = Number(mailCount)-1;
$("#mailCount").html(Number(mailCount) <= 0 ?'0':mailCount);
}
//修改个人资料
function editUserH(){
jzts();
var diag = new top.Dialog();
diag.Drag=true;
diag.Title ="个人资料";
diag.URL = locat+'/user/goEditU.do?id='+id+'&fx=head';
diag.Width = 469;
diag.Height = 469;
diag.CancelEvent = function(){ //关闭事件
diag.close();
};
diag.show();
}在线管理界面jsp
onlinemanager_list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html>
<head>
<title>在线管理</title>
<base href="<%=basePath%>">
</head>
<body>
<div class="pageHeader">
<form onsubmit="return navTabSearch(this);" action="onlinemanager/list.do" method="post">
</form>
</div>
<div class="pageContent layoutBox" >
<table style="margin-top:10px;">
<tr bgcolor="#E0E0E0" style="height:26px;">
<td style="padding-left: 15px;">在线人数:</td>
<td>
<div style="width:39px;" id="onlineCount">0</div>
</td>
</tr>
</table>
<table class="table" width="100%" >
<thead id="online-table">
<tr>
<th class="center" style="width: 50px;">
<div class="gridCol" title=""><input type="checkbox" group="names" class="checkboxCtrl"></div>
</th>
<th class='center' style="width:65px;">序号</th>
<th>用户名</th>
<th class="center" style="width: 120px;">操作</th>
</tr>
</thead>
<tbody id="userlist">
</tbody>
</table>
<div>
<a class="button" title="批量强制下线" href="javascript:;" onclick="makeAll()" ><span>批量强制下线</span></a>
</div>
</div>
<script type="text/javascript">
//初始化
$(function(){
online();
});
var websocketonline;//websocke对象
var userCount = 0; //在线总数
function online(){
if (window.WebSocket) {
websocketonline = new WebSocket(encodeURI('ws://'+top.oladress)); //oladress在main.jsp页面定义
websocketonline.onopen = function() {
websocketonline.send('[KENTRASOFT]fhadmin');//连接成功
};
websocketonline.onerror = function() {
//连接失败
};
websocketonline.onclose = function() {
//连接断开
};
//消息接收
websocketonline.onmessage = function(message) {
var message = JSON.parse(message.data);
console.log(message.list);
if (message.type == 'count') {
userCount = message.msg;
}else if(message.type == 'userlist'){
$("#userlist").html('');
$.each(message.list, function(i, user){
$("#userlist").append(
'<tr target="sname_user" rel="'+user+'">'+
'<td class="center" style="width: 47px;">'+
("admin"==user?" ":'<div><input name="names" value="'+user+'" type="checkbox"></div>')+
'</td>'+
'<td class="center" style="width: 61px;">'+(i+1)+'</td>'+
'<td>'+user+'</td>'+
'<td style="width: 113px;" >'+
("admin"==user?" ":'<a class="button" href="javascript:;" onclick="goOutTUser(\''+user+'\')"><span>强制下线</span></a>')+
'</td>'+
'</tr>'
);
userCount = i+1;
});
$("#onlineCount").html(userCount);
}else if(message.type == 'addUser'){
$("#userlist").append(
'<tr target="sname_user" rel="'+message.user+'">'+
'<td class="center" style="width: 47px;">'+
("admin"==user?" ":'<div><input name="names" value="'+user+'" type="checkbox"></div>')+
'</td>'+
'<td class="center" style="width: 61px;">'+(userCount+1)+'</td>'+
'<td>'+message.user+'</td>'+
'<td class="center" style="width: 113px;" >'+
("admin"==message.user?" ":'<a class="button" href="javascript:;" onclick="goOutTUser(\''+message.user+'\')"><span>强制下线</span></a>')+
'</td>'+
'</tr>'
);
userCount = userCount+1;
$("#onlineCount").html(userCount);
}
};
}
}
//强制某用户下线
function goOutUser(theuser){
websocketonline.send('[goOut]'+theuser);
}
//强制某用户下线
function goOutTUser(theuser) {
if ('admin' == theuser) {
alertMsg.info('不能强制下线admin用户!')
return;
}
alertMsg.confirm("确定要强制[" + theuser + "]下线吗?", {
okCall : function() {
goOutUser(theuser);
}
});
}
//批量操作
function makeAll(){
var nameStr = "";
navTab.getCurrentPanel().find("input:checked").filter(
"[name=names]").each(function(i) {
var val = $(this).val();
if ("admin" != val) {
nameStr += val + " ";
}
});
if (!nameStr) {
alertMsg.info('请选择用户');
return;
}
alertMsg.confirm("确定要强制[" + nameStr + "]下线吗?", {
okCall : function() {
navTab.getCurrentPanel().find("input:checked").filter(
"[name=names]").each(function(i) {
var val = $(this).val();
if ("admin" != val) {
goOutUser(val);
}
});
}
});
}
</script>
</body>
</html>说明:
服务端调用,客户端监听
OnlineChatServer.sendNews("flowTodo","流程提交", user.getUserName());//服务器调用
//客户端监听
websocket.onmessage = function(message) {
var message = JSON.parse(message.data);
if(message.type == 'goOut'){
$("body").html("");
goOut("1");
}else if(message.type == 'thegoout'){
$("body").html("");
goOut("2");
}else if(message.type == 'senFhsms'){
alert(message.layout+":"+message.content);
}客户端调用,服务端监听
//客户端 连接成功(端口连接成功,表示可以传输数据了)
websocket.send('[join]'+user);
/**
* 客户端发送消息到服务器时触发事件
*/
@Override
public void onMessage(WebSocket conn, String message){
message = message.toString();
if(null != message && message.startsWith("[join]")){
this.userjoin(message.replaceFirst("\\[join\\]", ""),conn);
}else if(null != message && message.startsWith("[goOut]")){
this.goOut(message.replaceFirst("\\[goOut\\]", ""));
}else if(null != message && message.startsWith("[fhsms]")){
senFhsms(message.replaceFirst("\\[fhsms\\]", ""));
}else if(null != message && message.startsWith("[leave]")){
this.userLeave(conn);
}else if(null != message && message.startsWith("[count]")){
this.getUserCount(conn);
}else if(null != message && message.startsWith("[KENTRASOFT]")){
OnlineChatServerPool.setFhadmin(conn);
this.getUserList();
}else{
OnlineChatServerPool.sendMessageToUser(conn, message);//同时向本人发送消息
}
}其他:即时通讯,在线聊天的两个类
ChatServer.java
package com.kentra.plugin.websocketInstantMsg;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.Date;
import net.sf.json.JSONObject;
import org.java_websocket.WebSocket;
import org.java_websocket.WebSocketImpl;
import org.java_websocket.framing.Framedata;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
/**
* 即时通讯
* @author KENTRASOFT
* QQ 313596790
* 2015-5-16
*/
public class ChatServer extends WebSocketServer{
public ChatServer(int port) throws UnknownHostException {
super(new InetSocketAddress(port));
}
public ChatServer(InetSocketAddress address) {
super(address);
}
/**
* 触发连接事件
*/
@Override
public void onOpen( WebSocket conn, ClientHandshake handshake ) {
//this.sendToAll( "new connection: " + handshake.getResourceDescriptor() );
//System.out.println("===" + conn.getRemoteSocketAddress().getAddress().getHostAddress());
}
/**
* 触发关闭事件
*/
@Override
public void onClose( WebSocket conn, int code, String reason, boolean remote ) {
userLeave(conn);
}
/**
* 客户端发送消息到服务器时触发事件
*/
@Override
public void onMessage(WebSocket conn, String message){
message = message.toString();
if(null != message && message.startsWith("FHadminKENTRASOFT")){
this.userjoin(message.replaceFirst("FHadminKENTRASOFT", ""),conn);
}if(null != message && message.startsWith("LeaveFHadminKENTRASOFT")){
this.userLeave(conn);
}if(null != message && message.contains("fhadmin886")){
String toUser = message.substring(message.indexOf("fhadmin886")+10, message.indexOf("fhfhadmin888"));
message = message.substring(0, message.indexOf("fhadmin886")) +"[私信] "+ message.substring(message.indexOf("fhfhadmin888")+12, message.length());
ChatServerPool.sendMessageToUser(ChatServerPool.getWebSocketByUser(toUser),message);//向所某用户发送消息
ChatServerPool.sendMessageToUser(conn, message);//同时向本人发送消息
}else{
ChatServerPool.sendMessage(message.toString());//向所有在线用户发送消息
}
}
public void onFragment( WebSocket conn, Framedata fragment ) {
}
/**
* 触发异常事件
*/
@Override
public void onError( WebSocket conn, Exception ex ) {
ex.printStackTrace();
if( conn != null ) {
//some errors like port binding failed may not be assignable to a specific websocket
}
}
/**
* 用户加入处理
* @param user
*/
public void userjoin(String user, WebSocket conn){
JSONObject result = new JSONObject();
result.element("type", "user_join");
result.element("user", "<a onclick=\"toUserMsg('"+user+"');\">"+user+"</a>");
ChatServerPool.sendMessage(result.toString()); //把当前用户加入到所有在线用户列表中
String joinMsg = "{\"from\":\"[系统]\",\"content\":\""+user+"上线了\",\"timestamp\":"+new Date().getTime()+",\"type\":\"message\"}";
ChatServerPool.sendMessage(joinMsg); //向所有在线用户推送当前用户上线的消息
result = new JSONObject();
result.element("type", "get_online_user");
ChatServerPool.addUser(user,conn); //向连接池添加当前的连接对象
result.element("list", ChatServerPool.getOnlineUser());
ChatServerPool.sendMessageToUser(conn, result.toString()); //向当前连接发送当前在线用户的列表
}
/**
* 用户下线处理
* @param user
*/
public void userLeave(WebSocket conn){
String user = ChatServerPool.getUserByKey(conn);
boolean b = ChatServerPool.removeUser(conn); //在连接池中移除连接
if(b){
JSONObject result = new JSONObject();
result.element("type", "user_leave");
result.element("user", "<a onclick=\"toUserMsg('"+user+"');\">"+user+"</a>");
ChatServerPool.sendMessage(result.toString()); //把当前用户从所有在线用户列表中删除
String joinMsg = "{\"from\":\"[系统]\",\"content\":\""+user+"下线了\",\"timestamp\":"+new Date().getTime()+",\"type\":\"message\"}";
ChatServerPool.sendMessage(joinMsg); //向在线用户发送当前用户退出的消息
}
}
public static void main( String[] args ) throws InterruptedException , IOException {
WebSocketImpl.DEBUG = false;
int port = 8887; //端口
ChatServer s = new ChatServer(port);
s.start();
//System.out.println( "服务器的端口" + s.getPort() );
}
}ChatServerPool.java
package com.kentra.plugin.websocketInstantMsg;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.java_websocket.WebSocket;
/**
* 即时通讯
* @author KENTRASOFT
* QQ 313596790
* 2015-5-16
*/
public class ChatServerPool {
private static final Map<WebSocket,String> userconnections = new HashMap<WebSocket,String>();
/**
* 获取用户名
* @param session
*/
public static String getUserByKey(WebSocket conn){
return userconnections.get(conn);
}
/**
* 获取WebSocket
* @param user
*/
public static WebSocket getWebSocketByUser(String user){
Set<WebSocket> keySet = userconnections.keySet();
synchronized (keySet) {
for (WebSocket conn : keySet) {
String cuser = userconnections.get(conn);
if(cuser.equals(user)){
return conn;
}
}
}
return null;
}
/**
* 向连接池中添加连接
* @param inbound
*/
public static void addUser(String user, WebSocket conn){
userconnections.put(conn,user); //添加连接
}
/**
* 获取所有的在线用户
* @return
*/
public static Collection<String> getOnlineUser(){
List<String> setUsers = new ArrayList<String>();
Collection<String> setUser = userconnections.values();
for(String u:setUser){
setUsers.add("<a onclick=\"toUserMsg('"+u+"');\">"+u+"</a>");
}
return setUsers;
}
/**
* 移除连接池中的连接
* @param inbound
*/
public static boolean removeUser(WebSocket conn){
if(userconnections.containsKey(conn)){
userconnections.remove(conn); //移除连接
return true;
}else{
return false;
}
}
/**
* 向特定的用户发送数据
* @param user
* @param message
*/
public static void sendMessageToUser(WebSocket conn,String message){
if(null != conn && null != userconnections.get(conn)){
conn.send(message);
}
}
/**
* 向所有的用户发送消息
* @param message
*/
public static void sendMessage(String message){
Set<WebSocket> keySet = userconnections.keySet();
synchronized (keySet) {
for (WebSocket conn : keySet) {
String user = userconnections.get(conn);
if(user != null){
conn.send(message);
}
}
}
}
}---------------------------------------------------------------------------------
① OnlineChatServerPool中主要是连接池的管理(向连接池中添加对象,移除对象)
②OnlineChatServer.java 中主要是在线管理类,管理上线(上线,将上线的用户添加到连接池中,并刷新在线用户列表),
强制下线,监听下线(下线后将连接池中的对象移除,并刷新在线用户列表)。监听处理客服端发来的消息。
③main.jsp 中引入了head.js ,head.js中初始化的时候,就建立连接,连接成功后,把用户名发送到服务器。
head.js中//消息接收 websocket.onmessage ,监听着来自服务器的消息,不同的消息类型有不同的处理方式,比如待办,主要是刷新待办列表。
④这里也可以实现当有通知消息的时候,我们在右下角弹出窗口,及时通知。或者右下角提示大家某某某上线了或下线了。
及时通讯也应用于在线聊天,但是这个受制于网络条件,如果网速不好,可能有的消息无法收到。
⑥ChatServer.java主要是聊天的服务类
⑦ChatServerPool.java聊天池管理,通知某某某上线了,给对应的用户发送消息等。
总结:
其实我们更多的用的是在线管理和站内信管理。只是用了即时通讯的技术和思想。上下线管理集中体现在实时在线用户列表,可以了解哪些用户在线,这样也方便我们发布版本的时候监控
系统使用情况。
在处理流程时,运用即时通讯,刷新其他客户端的待办列表,使信息实时同步。微信端处理后,刷新PC端。
在线聊天我们没有做,但是技术应该就是这样,只是怎么让聊天窗口,看着更好一些。
---------------------------------------------------------------------------------
原文地址:http://blog.51cto.com/jianboli/2073602