package com.juick.jabber.ws; import java.io.PrintWriter; import java.nio.ByteBuffer; import java.sql.Connection; import java.util.Iterator; /** * * @author ugnich */ public class WSKeepAlive implements Runnable { Connection sql; ByteBuffer pingBytes; ByteBuffer closeBytes; public WSKeepAlive(Connection sql) { this.sql = sql; //pingBytes = ByteBuffer.allocate(2); //pingBytes.put((byte) 0x8A); // PONG FRAME //pingBytes.put((byte) 0x00); // 0 byte long pingBytes = ByteBuffer.allocate(3); pingBytes.put((byte) 0x81); // TEXT FRAME pingBytes.put((byte) 0x01); // 1 byte long pingBytes.put((byte) 0x20); // ' ' pingBytes.flip(); closeBytes = ByteBuffer.allocate(2); closeBytes.put((byte) 0x88); // CLOSE FRAME closeBytes.put((byte) 0x00); // 0 byte long closeBytes.flip(); } @Override public void run() { while (true) { PrintWriter statsFile = null; if (Main.STATSFILE != null) { try { statsFile = new PrintWriter(Main.STATSFILE, "UTF-8"); } catch (Exception e) { statsFile = null; System.err.println("WSKeepAlive statsFile: " + e); } } long now = System.currentTimeMillis(); synchronized (Main.clients) { if (statsFile != null) { statsFile.write("

Connections (" + Main.clients.size() + ")

"); } for (Iterator i = Main.clients.iterator(); i.hasNext();) { SocketSubscribed s = i.next(); int inactive = (int) ((double) (now - s.tsLastData) / 1000.0); if (statsFile != null) { try { statsFile.print(""); statsFile.print(""); statsFile.print(""); statsFile.print(""); statsFile.print(""); statsFile.print(""); statsFile.print(""); } catch (Exception e) { System.err.println("WSKeepAlive statsFile print: " + e); } } if (inactive > 180) { closeBytes.rewind(); try { s.sock.write(closeBytes); } catch (Exception e) { } finally { try { s.sock.socket().close(); } catch (Exception ex) { } try { s.sock.close(); } catch (Exception ex) { } i.remove(); } } else if (inactive > 60) { pingBytes.rewind(); try { s.sock.write(pingBytes); } catch (Exception e) { System.err.println("WSKeepAlive ping: " + e); try { s.sock.socket().close(); } catch (Exception ex) { } try { s.sock.close(); } catch (Exception ex) { } i.remove(); } } } } if (Main.STATSFILE != null) { try { statsFile.write("
IPinactiveVUIDUIDMIDallMallR
" + (s.clientName != null ? s.clientName : "?") + "" + inactive + "" + (s.VUID > 0 ? s.VUID : "") + "" + (s.UID > 0 ? s.UID : "") + "" + (s.MID > 0 ? s.MID : "") + "" + (s.allMessages ? "+" : "") + "" + (s.allReplies ? "+" : "") + "
"); statsFile.close(); } catch (Exception e) { System.err.println("WSKeepAlive statsFile close: " + e); } } try { Thread.sleep(10000); } catch (InterruptedException e) { } } } }