本文介绍一个基于websocket实现的远程实时日志系统,可以通过浏览器查看远程移动设备的实时运行日志。
系统由三个部分组成:
1. 服务器:与移动设备和浏览器建立websocket连接,将移动设备websocket上读取的实时日志转发到对应的浏览器的websocket中
2. 浏览器日志查看页面:与服务器建立websocket连接,通过websocket接收指定设备的实时运行日志并显示
3. 移动设备:与服务器建立websocket连接,将运行日志通过websocket连接上传至服务器
服务器端实现
Tomcat 7.0.27 开始支持Websocket了。本文的服务器端Servlet程序是搭建在Tomcat上的。关于在Tomcat上面实现支持websocket的servlet,可以参考
服务器Servlet源码:
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
/**
* Servlet implementation class WebLogcat
*/
@WebServlet("/WebLogcat")
public class WebLogcat extends WebSocketServlet {
private static final long serialVersionUID = 1L;
private final Set
connections =
new CopyOnWriteArraySet
();
private final Map
devices =
new ConcurrentHashMap
();
private final Map<String, Set
> browsers = new ConcurrentHashMap<String, Set
>(); @Override protected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest arg1) { String id = arg1.getParameter("id"); String type = arg1.getParameter("type"); if( id != null && type != null ) { if( type.equalsIgnoreCase("device") ) { return new DeviceMessageInbound( id ); } else if( type.equalsIgnoreCase("browser") ) { return new BrowserMessageInbound( id ); } } // return NULL will lead to Exception return new LogMessageInbound(); } private final class DeviceMessageInbound extends MessageInbound { private String _id; DeviceMessageInbound(String id) { _id = id; } @Override protected void onClose(int status) { // remove me from device hash map devices.remove(_id); super.onClose(status); } @Override protected void onOp