LINUX.ORG.RU

Рассылать/получать много-много мелких событий без flash/java


0

1

Хочу сделать простенькую систему презентаций: на экране картинка, ведущий по ней елозит мышкой, координаты передаются на сервер, а оттуда всем зрителям, в результате у всех по экрану елозит курсор ведущего.

В случае флеша, на котором большая часть подобных штуковин и реализована, все просто: RTMP + SharedObject, а далее просто добавляем в глобальный хеш координаты курсора хоть 100 раз в секунду и сервер отсылает на сервер. Протокол бинарный, трафик минимальный, курсор ездиет плавно и точно. Всей писанины на 10 строк.

Вопрос: как повторить, но без флеша? Слать на каждый апдейт отдельный запрос - слишком жирно, ибо ответ будет несколько байт, а заголовки и на килобайт потянут. Да и 100 fps не получить, быстрее nginx пошлет нафиг (500 зрителей на 100 запросов в секунду). Вебсокеты - красиво, но пока рано. Жабоапплеты? Опять же, не везде есть JVM + это ничем не лучше флеша. «Комет»-сервер, который будет плеваться потоком из <script>update(123,345);</script>, который подгружать в iframe? Не представляю, как чистить такое, ибо достаточно быстро оно засрет оперативку браузера, да и буферизация не даст моментально исполнять код, выйдет так, что события будут прилетать и исполняться пачками по 200 штук за раз (паузы можно расставить, но какой же это реалтайм? Лекцию живой голос комментирует)

Вопрос: задача вообще решаема? Если да, то как?

Ответ на: комментарий от xpahos

Можно конечно. Вот только пускать мегабит трафика там, где можно просто курсор подвигать, да еще и насиловать сервер кодированием - это странно.

one_time837
() автор топика
Ответ на: комментарий от one_time837

Перед проведением презентации отметить на фотке важные элементы и либо использовать навигацию по важным элементом табом/стрелочками, либо связать с тезисом/элементом оглавления доклада и просто тыкать уже по тезисам, это удобно.

емнип, такие системы уже есть в паблике, ну и мы когда-то такое клепали для своих презенташек на флеше

stevejobs ★★★★☆
()
Ответ на: комментарий от one_time837

если на картинке будет всего-лишь ездить курсор, то и трафика будет гораздо меньше.

и да, насиловать сервер кодированием это странно, т к обычно кодированием занимается клиент

но если очень хочется покодить, то велкам socket.io

redixin ★★★★
()

суть такова

клиент

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

    <head>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
        <script type="text/javascript" src="socket.io.js"></script>
        <script type="text/javascript">
var reconnectInterval = 1000;
var ping = new io.connect('http://localhost:8881/');
var cur;
ping.on('disconnect', function() { setTimeout(ping.socket.reconnect(), reconnectInterval); });

ping.on('moved', function(x ,y) {
        cur.offset({left: x, top: y});
});

$(function(){
    cur = $("#cur");
    $("#move").mousemove(
        function(e) {
            ping.emit("mmove", [e.pageX, e.pageY]);
        });
});
</script>
</head>

    <body>
        <div style="background-color: red; width: 4in; height: 5in;" id=move></div>
        <div style="background-color: black; width: 5px; height: 5px;" id=cur></div>
    </body>

</html>

сервер

from tornado import web
from tornado.ioloop import IOLoop
from tornadio2 import SocketConnection, TornadioRouter, SocketServer, event
from tornadio2.periodic import Callback

clients = []

class PingConnection(SocketConnection):

    def on_open(self, request):
        clients.append(self)

    def on_close(self):
        clients.remove(self)

    @event
    def mmove(self, data):
        for c in clients:
            c.emit("moved", data[0], data[1])

PingRouter = TornadioRouter(PingConnection)
application = web.Application(
    PingRouter.apply_routes([]),
    socket_io_port = 8881)

if __name__ == "__main__":
    SocketServer(application)

tornadio2 есть где-то на гитхабе.

наверное лучше юзать node.js, но это уже сами

redixin ★★★★
()
Ответ на: суть такова от redixin

дело в том что если нет флеша (условие тс) и вебсокеты не подходят (прерогатива тс) то сокет.ио обосрется на такой задаче

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

тащемта нет, потому что xhr-polling например

и да, ТСу стоит отбросить предрассудки, и согласиться на все что умеет socket.io

redixin ★★★★
()
Ответ на: комментарий от redixin

Если впустить флеш в свой дом, то задача реализуется в 10 строк с RTMP. Но проблема в том, что обязательно найдется пара (десяткой) человек, у которой или флеш старый, или что-то там глючит, в результате чего не понятно, или у презентатора косяки, или у клиентов.

Websockets нету в опере и ИЕ (не ставить же всем превью), поэтому это еще хуже чем флеш.

Остается только поллинг. Большой привет сотне запросов в секунду. Смотрим слайдшоу в 1fps в лучшем случае.

one_time837
() автор топика
Ответ на: комментарий от one_time837

если отбросить предрассудки из своего дома, то io.socket включит флеш где есть флеш, вебсокеты где есть вебсокеты, и xhr там где нет ни флеша ни вебсокетов.

более того, даже xhr на жалких 100 клиентах будет вполне летать

но да, я склоняюсь к трансляции потокового видео, ибо видеозахватом можно показать все что угодно. вон народ на джастине игры стримит, и все отлично

redixin ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.