首先,如果我们想在客户端获取服务端的日志,最容易想到的肯定是客户端浏览器发个get请求,后端收到后读取本地日志文件,然后返回给客户端,完成一次请求,但是因为日志是在不断更新写入的,如果用户想实时动态的看到日志的话,就需要浏览器不断的发送这个get请求,这样才能实现动态的刷新日志的效果,显然这么做会对网络造成较大的负担。今天要说一个更好的实现方式:websocket。
websocket其实就是客户端连接服务端后,连接不会中断,这样服务端就可以不断的推送信息给客户端,具体是啥就不细说了,直接上代码了。
首先是配置类:
package com.sunsy.websocket_demo.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
然后我们需要写一个读取日志的工具类,这个类要继承Thread,不然的话我们在WebSocketServer类里使用的时候会因为Process.getInputStream()阻塞导致程序无法运行。下面是工具类TailLogUtil代码:
package com.sunsy.websocket_demo.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.websocket.Session;
public class TailLogUtil extends Thread {
private final int READ_SIZE = 128; //日志文件默认读取大小,单位:KB
private final int TIME_MILLS = 100; //日志读取返回时间
private final int READ_LINES = 10; //日志读取每次返回的行数
private BufferedReader reader;
private Session ses