引用tomcat中的两个jar:websocket-api.jar 、tomcat7-websocket.jar
java后台:
package com.inspur.dataetl.monitor;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.inspur.data.common.utils.ConfUtil;
/**
* @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
*/
@ServerEndpoint("/websocket")
public class LogMonitor {
// 静态变量,用来记录当前在线连接数。
private static int onlineCount = 0;
// 记录线程与session之间的对应关系
private static Map
private Process process;
private InputStream inputStream;
/**
* 连接建立成功调用的方法
*
* @param session
*session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void onOpen(Session session) {
addOnlineCount(); // 在线数加1
LOG.info("有新连接加入!当前在线人数为" + getOnlineCount());
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(Session session) {
subOnlineCount(); // 在线数减1
LOG.info("有连接关闭!当前在线人数为" + getOnlineCount());
//删除该session对应的process
if (sessionProcessRelate.get(session.getId())!= null){
sessionProcessRelate.get(session.getId()).destroy();
sessionProcessRelate.remove(session.getId());
}
}
/**
* 收到客户端消息后调用的方法
*
* @param message
* 客户端发送过来的消息
* @param session
* 可选的参数
*/
@OnMessage
public void onMessage(String message, Session session) {
// 执行tail -f命令
// 如果非root启动liunux注意权限问题
// ConfUtil.getConfValue("logDir")为获取日志文件路径,message为前端传入的需要监控的文件名
String logDir = ConfUtil.getConfValue("logDir");}
新线程:
package com.inspur.dataetl.monitor;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import javax.websocket.Session;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TailLogThread extends Thread {
public BufferedReader reader;
private Session session;
private static final Log log = LogFactory.getLog(TailLogThread.class);
public TailLogThread(InputStream in, Session session) {
try {
this.reader = new BufferedReader(new InputStreamReader(in,"UTF-8"));
} catch (UnsupportedEncodingException e) {
log.error("读取日志文件转码失败"+e.getMessage(),e);
}
this.session = session;
}
@Override
public void run() {
String line;
try {
while ((line = reader.readLine()) != null) {
// 将实时日志通过WebSocket发送给客户端
if (session.isOpen()) {
session.getBasicRemote().sendText(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
前端jsp:
<%@ page language="java" pageEncoding="UTF-8" %>