Гуглил я гуглил решение. Потом решил по старинке - взять и написать свое. Это не изобретать велосипед - не скажи. И это лучше чем готовый сервис, поскольку можно допиливать под свои нужды.
Итак проект maven, сервер на jetty/java, киент - java script/jquery, связь тудым-сюдым web socket.
Вот рабочий задеплоенный на сервак codenjoy.com код. Можно встраивать в свой блог. Только пока не гарантирую что при перезапуске не полетят все время (позже сделаю, чтобы оно сохранялось). Пока так - AS IS. Вот исходный код.
И клиента
Собрать варник
mvn clean
mvn package
mvn war:war
Запустить джетти на локали
mvn jerry:run
Обратить внимание на урл сервера в клиенте
Так же внимательнее с контекстом "/timer/", если собрался поменять, то он встречается в pom.xml и timer.js
Время на разработку - 1 час 20 минут. Время на пост в блоге - 15 минут.
Итак проект maven, сервер на jetty/java, киент - java script/jquery, связь тудым-сюдым web socket.
Вот рабочий задеплоенный на сервак codenjoy.com код. Можно встраивать в свой блог. Только пока не гарантирую что при перезапуске не полетят все время (позже сделаю, чтобы оно сохранялось). Пока так - AS IS. Вот исходный код.
<script language="JavaScript" type="text/javascript" src="http://codenjoy.com/timer/timer.js"></script>
<script language="JavaScript" type="text/javascript" src="http://codenjoy.com/timer/jquery-1.11.0_min.js"></script>
<script language="JavaScript" type="text/javascript" >
setupTimeWatcher("timer_info_div");
</script>
<center><div style="display:inline-flex;">
<div id="timer_info_div"></div>
<div> - столько времени читатели проводят на блоге</div>
</div></center>
Дальше код сервераpackage com.apofig;
import org.eclipse.jetty.websocket.WebSocket;
import org.eclipse.jetty.websocket.WebSocketServlet;
import org.json.JSONObject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
public class TimerServlet extends WebSocketServlet {
public static HashMap<String, Integer> times = new HashMap<String, Integer<();
@Override
public void init() throws ServletException {
super.init();
}
@Override
public WebSocket doWebSocketConnect(HttpServletRequest httpRequest, String protocol) {
return new WebSocket.OnTextMessage() {
public Connection connection;
@Override
public void onMessage(String data) {
try {
synchronized (times) {
JSONObject signal = new JSONObject(data);
String type = signal.getString("type");
String hash = signal.getString("hash");
if (!times.containsKey(hash)) {
times.put(hash, 0);
}
if (type.equals("tick")) {
int time = signal.getInt("time");
times.put(hash, times.get(hash) + time);
}
if (type.equals("get")) {
connection.sendMessage(String.valueOf(times.get(hash)));
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onOpen(WebSocket.Connection conn) {
connection = conn;
}
@Override
public void onClose(int closeCode, String message) {
connection = null;
}
};
}
}И клиента
function setupTimeWatcher(timerDivId, reportToServerDelayInSec, getFromServerTotalTimeDelayInSec) {
if (!reportToServerDelayInSec) reportToServerDelayInSec = 5;
if (!getFromServerTotalTimeDelayInSec) getFromServerTotalTimeDelayInSec = 1;
$().ready(function() {
var total = 0;
var activity = false;
var hash = document.domain;
var server = new WebSocket("ws://192.168.1.102:8080/timer/ws");
// var server = new WebSocket("ws://tetrisj.jvmhost.net:12270/timer/ws");
server.onopen = function() {
server.onmessage = onGetTotal;
tick(report, reportToServerDelayInSec * 1000);
tick(getTotal, getFromServerTotalTimeDelayInSec * 1000);
};
// thanks to powtac (http://stackoverflow.com/questions/6312993/javascript-seconds-to-time-with-format-hhmmss)
var toHHMMSS = function (seconds) {
var sec_num = parseInt(seconds, 10); // don't forget the second param
var hours = Math.floor(sec_num / 3600);
var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
var seconds = sec_num - (hours * 3600) - (minutes * 60);
if (hours < 10) {hours = "0"+hours;}
if (minutes < 10) {minutes = "0"+minutes;}
if (seconds < 10) {seconds = "0"+seconds;}
var time = hours+':'+minutes+':'+seconds;
return time;
}
var onGetTotal = function (event) {
var total = JSON.parse(event.data);
$("#" + timerDivId).html(toHHMMSS(total));
}
var getTotal = function () {
var request = { type : "get", hash : hash };
server.send(JSON.stringify(request));
}
var onActivity = function() {
activity = true;
};
var inc = function () {
if (activity) total++;
activity = false;
};
var tick = function(smth, delay) {
setTimeout(function(){
if (!!smth) {
smth();
}
tick(smth, delay);
}, delay);
};
var report = function() {
var data = { type : "tick", time : total, hash : hash };
server.send(JSON.stringify(data));
total = 0;
};
$(window).mousemove(onActivity);
$(window).keypress(onActivity);
$(window).scroll(onActivity);
tick(inc, 1000);
});
}
Собрать варник
mvn clean
mvn package
mvn war:war
Запустить джетти на локали
mvn jerry:run
Обратить внимание на урл сервера в клиенте
...
$().ready(function() {
var total = 0;
var activity = false;
var hash = document.domain;
var server = new WebSocket("ws://192.168.1.102:8080/timer/ws"); // TODO вот тут айпишка и порт должны быть
...
Так же внимательнее с контекстом "/timer/", если собрался поменять, то он встречается в pom.xml и timer.js
Время на разработку - 1 час 20 минут. Время на пост в блоге - 15 минут.

Комментариев нет:
Отправить комментарий