2013-05-07 3 views
4

У меня есть запущенная реализация простых событий, отправленных сервером с использованием сервлетов.Сервер отправил события с использованием серверной стороны в качестве сервлетов

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
    // TODO Auto-generated method stub 

    try 
    { 
     System.out.println("Server Sent Events"); 
     response.setContentType("text/event-stream"); 

     PrintWriter pw = response.getWriter(); 
     int i=0; 
     pw.write("retry: 30000\n"); 
     System.out.println("----------------------"); 
     while(true) 
     { 
      i++; 

      pw.write("data: "+ i + "\n\n"); 
      System.out.println("Data Sent : "+i); 
      if(i>10) 
       break; 
     } 

    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

И мой клиент сторона код

<!DOCTYPE html> 
<html> 
<body onload ="SSE()" > 
<script> 

    function SSE() 
    { 
     var source = new EventSource('GetDate'); 
     source.onmessage=function(event) 
     { 
      document.getElementById("result").innerHTML+=event.data + "<br />"; 
     }; 
    } 
</script> 
<output id ="result"></output> 

</body> 
</html> 

Но может кто-нибудь объяснить мне, как это на самом деле работает? Как и как сервер отправляет кусок из 11 целых чисел за один раз? И нужно ли здесь закрыть или закрыть Printwriter. Использует ли сервер каждый раз новое соединение для отправки данных

+0

Не совсем дубликат, но есть [хорошее объяснение] (http://stackoverflow.com/q/5195452/575527) – Joseph

+0

есть ли специальная причина, по которой вы использовали цикл while? вы рассчитываете от 0 до 10, что является общей целью цикла 'for' ... –

+0

Что именно вы не понимаете и что вы уже понимаете? Что вы пытались выяснить, как это работает? Вбрасывание какого-то кода и высказывание «пожалуйста, объясните» не похоже на хороший вопрос для меня ... – Uooo

ответ

2

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

Также обратите внимание на флеш и закрытие. Вам не нужно использовать slufh, servletcontainer будет скрываться и закрывать его для вас. Закрытие кстати уже неявно вызывает flush.Calling flush обычно полезен только тогда, когда у вас несколько авторов в одном потоке, и вы хотите переключить автора (например, файл со смешанными двоичными/символьными данными) или когда вы хотите сохранить указатель потока открыт в течение неопределенного времени (например, файл журнала).

Смежные вопросы