基于https实现webSocket通信实时在web页⾯输出⽇志(两个⽇志输出)
需求
在同⼀页⾯输出tomcat和aserver的⽇志,相互之间不影响且随意切换不会出现jvm内存不⾜的问题。本⼈之前⽤js轮询做的,结果测试疯狂切换导致内存不⾜浏览器崩溃,卒。学习html5使⽤webSocket实现。
html5的webSocket简单介绍
页⾯实现⼀个webSocket连接
// 创建⼀个Socket实例
var socket = new WebSocket('ws://localhost:8080');
注:如果协议为https的则需要使⽤wss,并且在浏览器的安全例外中添加你的项⽬的访问路径
// 创建⼀个Socket实例
var socket = new WebSocket('wss://localhost:8080');
webSocket的各种⽤法
// 打开Socket
// 发送⼀个初始化消息
socket.send('发送消息!');
// 监听消息
console.log('实现监听',event);
};
// 监听Socket的关闭
console.log('监听关闭',event);
};
// 关闭
//socket.close()
};
以及下⾯是⽤到的
onmessage事件提供了⼀个data属性,它可以包含消息的Body部分。消息的Body部分必须是⼀个字符串,可以进⾏序列化/反序列化操作,以便传递更多的数据。
//对返回的消息处理
}
客户端实现(jsp页⾯实现)
//延时加载⽇志输出⽅法,加载完下⾯的全局变量后执⾏⽅法
setTimeout("alertlog2()",1000);
};
var websocketServerlog;
var websocketTomcatlog;
var tomcatflag=false;
//aserver⽇志输出
function alertlog() {
//获取将要输出的位置并将其显⽰
var traget = ElementById("hiddenLog");
traget.style.display = "";
/
/获取主机地址及端⼝号,动态显⽰
//如: localhost:8083
var curWwwPath = window.document.location.href;
var pathName = window.document.location.pathname;
var pos = curWwwPath.indexOf(pathName);
var localhostPaht = curWwwPath.substring(0, pos);
// 指定websocket路径,去掉https
var localhostPaht1 = localhostPaht.substring(8, localhostPaht.length);
websocketServerlog = new WebSocket('wss://' + localhostPaht1 + '/serverLog');
//清空上⼀次输出的内容
$('#hiddenLog div').html("");
/
/判断另⼀个webSocket是否开启,如果开启则关闭
if(tomcatflag==true){
websocketTomcatlog.close();
tomcatflag=false;
}
//对返回的数据处理
flag=true;
// 接收服务端的实时⽇志并添加到HTML页⾯中
$("#hiddenLog div").append(event.data);
// 滚动条滚动到最低部
$("#hiddenLog").scrollTop(
$("#hiddenLog div").height() - $("#hiddenLog").height());
};
}
//tomcat⽇志输出
function alertlog2() {
var traget = ElementById("hiddenLog");
traget.style.display = "";
var curWwwPath = window.document.location.href;
var pathName = window.document.location.pathname;
var pos = curWwwPath.indexOf(pathName);
var localhostPaht = curWwwPath.substring(0, pos);
// 指定websocket路径
var localhostPaht1 = localhostPaht.substring(8, localhostPaht.length);
websocketTomcatlog = new WebSocket('wss://' + localhostPaht1 + '/tomcatLog');
$('#hiddenLog div').html("");
if(flag==true){
websocketServerlog.close();
flag=false;
}
tomcatflag=true;
/
/ 接收服务端的实时⽇志并添加到HTML页⾯中
$("#hiddenLog div").append(event.data);
// 滚动条滚动到最低部
$("#hiddenLog").scrollTop(
$("#hiddenLog div").height() - $("#hiddenLog").height());
};
}
//输出区域(⾮js代码,html代码)可⾃⾏调整
<!-- 隐藏⽇志 -->
<div id="hiddenLog"class="hiddenLog"
>
</div>
服务端实现
tomcat⽇志
web.webSocket;
import java.io.IOException;
import java.io.InputStream;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/tomcatLog")
public class LogWebSocketHandle {
private Process process;
private InputStream inputStream;
/**
* 新的WebSocket请求开启
*/
@OnOpen
public void onOpen(Session session) {
try {
// 执⾏tail -f命令
/
/如果⾮root启动liunux注意权限问题
//路径改为⾃⼰的⽇志⽂件路径
process = Runtime().exec("tail -f /work/weblogs/catalina.out");
inputStream = InputStream();
// ⼀定要启动新的线程,防⽌InputStream阻塞处理WebSocket的线程            TailLogThread thread = new TailLogThread(inputStream, session);
thread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* WebSocket请求关闭
*/
@OnClose
public void onClose() {
try {
if(inputStream != null)
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
if(process != null)
process.destroy();
}
@OnError
public void onError(Throwable thr) {websocket和socket
thr.printStackTrace();
}
}
aserver同上注意访问路径,及输出的路径问题
线程开启
web.webSocket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.websocket.Session;
public class TailLogThread extends Thread {
private BufferedReader reader;
private Session session;
public TailLogThread(InputStream in, Session session) {
this.session = session;
}
@Override
public void run() {
String line;
try {
while((line = adLine()) != null) {
// 将实时⽇志通过WebSocket发送给客户端,给每⼀⾏添加⼀个HTML换⾏                BasicRemote().sendText(line + "<br>");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
神坑注意
如果设置了各种过滤器,控制台报错连接不上时,请注意⾃⼰的过滤器是否把请求拦截了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。