forked from integrated_whb/integrated_whb
213 lines
5.6 KiB
Java
213 lines
5.6 KiB
Java
|
package com.zcloud.plugins.websocketFace;
|
|||
|
|
|||
|
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;
|
|||
|
|
|||
|
import java.io.IOException;
|
|||
|
import java.net.InetSocketAddress;
|
|||
|
import java.net.UnknownHostException;
|
|||
|
|
|||
|
/**
|
|||
|
* 说明:在线管理
|
|||
|
* 作者:luoxiaobao
|
|||
|
* 官网:www.qdkjchina.com
|
|||
|
*/
|
|||
|
public class FaceServer extends WebSocketServer{
|
|||
|
|
|||
|
public FaceServer(int port) throws UnknownHostException {
|
|||
|
super(new InetSocketAddress(port));
|
|||
|
}
|
|||
|
|
|||
|
public FaceServer(InetSocketAddress address) {
|
|||
|
super(address);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 客户端发送消息到服务器时触发事件
|
|||
|
*/
|
|||
|
@Override
|
|||
|
public void onMessage(WebSocket conn, String message){
|
|||
|
message = message.toString();
|
|||
|
System.out.println("======================================");
|
|||
|
System.out.println(message);
|
|||
|
if(null != message && message.startsWith("[face]")){
|
|||
|
this.userjoin(message.replaceFirst("\\[face\\]", ""),conn);
|
|||
|
}else{
|
|||
|
FaceServerPool.sendMessageToUser(conn, message);//同时向本人发送消息
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
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){
|
|||
|
onlineMaganger(1,user,conn);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 站内信通知
|
|||
|
* @param user
|
|||
|
*/
|
|||
|
public void senFhsms(String user){
|
|||
|
JSONObject result = new JSONObject();
|
|||
|
result.element("type", "senFhsms");
|
|||
|
FaceServerPool.sendMessageToUser(FaceServerPool.getWebSocketByUser(user),result.toString()); //发送到PC端
|
|||
|
FaceServerPool.sendMessageToUser(FaceServerPool.getWebSocketByUser("mobile-"+user),result.toString()); //发送到手机端
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 新任务通知
|
|||
|
* @param user
|
|||
|
*/
|
|||
|
public void senFhTask(String user){
|
|||
|
JSONObject result = new JSONObject();
|
|||
|
result.element("type", "fhtask");
|
|||
|
WebSocket ws = FaceServerPool.getWebSocketByUser(user);
|
|||
|
WebSocket mws = FaceServerPool.getWebSocketByUser("mobile-"+user);
|
|||
|
if(null != ws || null != mws){
|
|||
|
if(null != ws){
|
|||
|
result.element("RNUMBER", "no");
|
|||
|
FaceServerPool.sendMessageToUser(ws,result.toString()); //当待办人是具体的人时发给其任务通知(PC端)
|
|||
|
}
|
|||
|
if(null != mws){
|
|||
|
result.element("RNUMBER", "no");
|
|||
|
FaceServerPool.sendMessageToUser(mws,result.toString()); //当待办人是具体的人时发给其任务通知(手机端)
|
|||
|
}
|
|||
|
}else{
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 强制某用户下线
|
|||
|
* @param user
|
|||
|
*/
|
|||
|
public void goOut(String user){
|
|||
|
this.goOut(FaceServerPool.getWebSocketByUser(user),"thegoout"); //PC端
|
|||
|
this.goOut(FaceServerPool.getWebSocketByUser("mobile-"+user),"thegoout"); //手机端
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 强制用户下线
|
|||
|
* @param conn
|
|||
|
*/
|
|||
|
public void goOut(WebSocket conn,String type){
|
|||
|
JSONObject result = new JSONObject();
|
|||
|
result.element("type", type);
|
|||
|
result.element("msg", "goOut");
|
|||
|
FaceServerPool.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", FaceServerPool.getUserCount());
|
|||
|
FaceServerPool.sendMessageToUser(conn,result.toString());
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 获取在线用户列表
|
|||
|
* @param user
|
|||
|
*/
|
|||
|
public void getUserList(){
|
|||
|
WebSocket conn = FaceServerPool.getFhadmin();
|
|||
|
if(null == conn){return;}
|
|||
|
JSONObject result = new JSONObject();
|
|||
|
result.element("type", "userlist");
|
|||
|
result.element("list", FaceServerPool.getOnlineUser());
|
|||
|
FaceServerPool.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 == FaceServerPool.getWebSocketByUser(user)){ //判断用户是否在其它终端登录
|
|||
|
FaceServerPool.addUser(user,conn); //向连接池添加当前的连接对象
|
|||
|
addUserToFhadmin(user);
|
|||
|
}
|
|||
|
}else{
|
|||
|
FaceServerPool.removeUser(conn); //在连接池中移除连接
|
|||
|
this.getUserList();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 有用户登录系统,加入在线列表
|
|||
|
* @param conn
|
|||
|
*/
|
|||
|
public void addUserToFhadmin(String user){
|
|||
|
WebSocket conn = FaceServerPool.getFhadmin();
|
|||
|
if(null == conn){return;}
|
|||
|
JSONObject result = new JSONObject();
|
|||
|
result.element("type", "addUser");
|
|||
|
result.element("user", user);
|
|||
|
FaceServerPool.sendMessageToUser(conn,result.toString());
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 触发连接事件
|
|||
|
*/
|
|||
|
@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 onStart() {
|
|||
|
// TODO Auto-generated method stub
|
|||
|
}
|
|||
|
|
|||
|
public static void main( String[] args ) throws InterruptedException , IOException {
|
|||
|
WebSocketImpl.DEBUG = false;
|
|||
|
int port = 8887; //端口
|
|||
|
FaceServer s = new FaceServer(port);
|
|||
|
s.start();
|
|||
|
//System.out.println( "服务器的端口" + s.getPort() );
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|