2016-07-21 18 views
0

Ich versuche, Web-Socket mit Funken zu verwenden und ich benutze/Chat als Endpunkt-URL. Folgendes ist mein Code.Heroku ist nicht in der Lage, Web-Socket zu verarbeiten

@ServerEndpoint("/chat") 
public class Main { 

    public static void main(String[] args) { 
    port(Integer.valueOf(System.getenv("PORT"))); 
    Spark.staticFileLocation("/public");  
    } 

    private static final Set<Session> sessions = Collections 
      .synchronizedSet(new HashSet<Session>()); 

    private static final HashMap<String, String> nameSessionPair = new HashMap<String, String>(); 

    private JSONUtils jsonUtils = new JSONUtils(); 

    public static Map<String, String> getQueryMap(String query) { 
     Map<String, String> map = Maps.newHashMap(); 
     if (query != null) { 
      String[] params = query.split("&"); 
      for (String param : params) { 
       String[] nameval = param.split("="); 
       map.put(nameval[0], nameval[1]); 
      } 
     } 
     return map; 
    } 

    @OnOpen 
    public void onOpen(Session session) { 

     System.out.println(session.getId() + " has opened a connection"); 

     Map<String, String> queryParams = getQueryMap(session.getQueryString()); 

     String name = ""; 

     if (queryParams.containsKey("name")) { 

     name = queryParams.get("name"); 
      try { 
       name = URLDecoder.decode(name, "UTF-8"); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 

      nameSessionPair.put(session.getId(), name); 
     } 

     sessions.add(session); 

     try { 
      session.getBasicRemote().sendText(
        jsonUtils.getClientDetailsJson(session.getId(), 
          "Your session details")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     sendMessageToAll(session.getId(), name, " joined conversation!", true, 
       false); 

    } 

    @OnMessage 
    public void onMessage(String message, Session session) { 

     System.out.println("Message from " + session.getId() + ": " + message); 

     String msg = null; 

     try { 
      JSONObject jObj = new JSONObject(message); 
      msg = jObj.getString("message"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     sendMessageToAll(session.getId(), nameSessionPair.get(session.getId()), 
       msg, false, false); 
    } 

    @OnClose 
    public void onClose(Session session) { 

     System.out.println("Session " + session.getId() + " has ended"); 

     String name = nameSessionPair.get(session.getId()); 

     sessions.remove(session); 

     sendMessageToAll(session.getId(), name, " left conversation!", false, 
       true); 

    } 

    private void sendMessageToAll(String sessionId, String name, 
      String message, boolean isNewClient, boolean isExit) { 

     for (Session s : sessions) { 
      String json = null; 

      if (isNewClient) { 
       json = jsonUtils.getNewClientJson(sessionId, name, message, 
         sessions.size()); 

      } else if (isExit) { 
       json = jsonUtils.getClientExitJson(sessionId, name, message, 
         sessions.size()); 
      } else { 
       json = jsonUtils 
         .getSendAllMessageJson(sessionId, name, message); 
      } 

      try { 
       System.out.println("Sending Message To: " + sessionId + ", " 
         + json); 

       s.getBasicRemote().sendText(json); 
      } catch (IOException e) { 
       System.out.println("error in sending. " + s.getId() + ", " 
         + e.getMessage()); 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Das Problem ist, dass die onOpen Methode nie aufgerufen wird und wenn der Benutzer die URL Endpunkt erreicht hat, wirft es 404 Fehler. Warum ist das so? Ich bin es mit Heroku bereitstellen und ich verwende Socket_url als meine Site-Name und ich habe den Port in meiner Js-Datei leer gelassen.

Wie kann ich das aussortieren?

+0

Ist es vor Ort arbeiten? – codefinger

+0

ja es tut .... – Learner

+0

Ein 404 würde von Ihrem Server kommen, so dass die Anfrage es in die App macht. Könnte prüfen http vs https – codefinger

Antwort

1

Dieser Code funktioniert nicht mit example from Heroku.com. Es ist weil Kater und Anlegesteg Läufer keine Unterstützung für Webstore Annotation haben (weiß nicht den Grund). Sie können es mit Embedded Jetty ausführen. Beispiel für Hauptmethode, pom für Maven und procfile für Heroku Sie können bei privateblog.info finden:

web: java $JAVA_OPTS -cp target/JettyServer-0.0.1-SNAPSHOT-jar-with-dependencies.jar info.privateblog.Proxy $PORT