Partage
  • Partager sur Facebook
  • Partager sur Twitter

Server-Sent Events : Pas de réception coté client

    1 décembre 2016 à 22:50:26

    Bonjour/Bonsoir,

    Je suis en train de développer une application web.

    Java :

    package servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.HashMap;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import data.Evenement;
    import data.ListeDesMatchs;
    import data.Match;
    
    public class Event extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
        public Event() {
            super();
        }
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		Match[] listeMatch = ListeDesMatchs.getInstance().getAllMatch();
    		HashMap<Integer, Integer> listNbEvent = new HashMap<Integer, Integer>();
    		response.setContentType("text/event-stream");
    		response.setCharacterEncoding("UTF-8");
    		PrintWriter writer = response.getWriter();
    		System.out.println("Taille listeMatch : "+listeMatch.length);
    		for(Match match: listeMatch){
    			System.out.println("ID : " +match.getId());
    			System.out.println("nb Event : "+match.getEvtMatch().size());
    			listNbEvent.put(match.getId(), match.getEvtMatch().size());
    		}
    		while(true){
    			for(Match match: listeMatch){
    				System.out.println("ID : " +match.getId());
    				System.out.println("nb Event : "+match.getEvtMatch().size());
    				if(match.getEvtMatch().size() != listNbEvent.get(match.getId()).intValue()){
    					System.out.println("Changement nombre event match : " + match.getId());
    					Evenement evt = match.getEvtMatch().get(match.getEvtMatch().size()-1);
    					System.out.println(evt.toString());
    					listNbEvent.put(match.getId(), match.getEvtMatch().size());
    					writer.write("data: "+ evt.toString() +"\n\n");
    				}
    			}
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    	}
    }

    Javascript :

    function startEventNotifier(){
    	var eventSource = new EventSource("Event");
    	eventSource.onmessage = function(evt){
    		console.log("hint");
    		console.log(evt.data);
    	}
    }

    Cette fonction javascript est lancée au chargement de la page.

    Dans ma console serveur je vois que tout fonctionne, la seule chose que je ne peux pas vérifier est le "writer.write("data: "....."

    Mais au niveau de mon javascript je n'écris rien dans la console.

    Des idées ?


    • Partager sur Facebook
    • Partager sur Twitter
      2 décembre 2016 à 9:09:17

      Essayer de flush et close ton printWriter à la fin, de plus test sans passer par javascript, juste en accédant à ta Servlet avec un navigateur, si tu a quelque chose, cela signifie un problème de javascript si tu n'a rien, problème dans ta Servlet.

      Quand tu as un problème pour le résoudre, il est préférable de retirer le plus de couche possible.

      • Partager sur Facebook
      • Partager sur Twitter
        3 décembre 2016 à 22:12:23

        Merci beaucoup, ajouter un flush a fonctionné.

        J'aimerais maintenant pouvoir envoyer un objet, pour cela j'ai modifié la ligne du writer.write comme suit :

        writer.write("data:{id:" + match.getId() + ",type: " + type + ",message: " + evt.toString()+"}");

        Ce qui donne, lorsque printé, la chaine suivante :

        data:{"id":1,"type":"Goal ","message":"Evenement : temps = 360, message = Goal Equipe C => penalite = false"}

        J'ai encore une fois essayer de l'afficher à l'aide d'un console.log() mais cela ne fonctionne pas. Je suppose que je ne construit pas correctement mon objet, comment devrais-je le construire ?

        • Partager sur Facebook
        • Partager sur Twitter
          5 décembre 2016 à 8:55:37

          Qu'est ce que cela te donne quand tu accède à ta Servlet via un navigateur (sans passer par du javascript)
          • Partager sur Facebook
          • Partager sur Twitter

          Server-Sent Events : Pas de réception coté client

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown