0

Ich verwende einen Java-Server (Jetty, um genau zu sein) auf einer AWS EC2-Instanz mit WebSocket, um eine Verbindung mit einem Client-Browser herzustellen. Wenn ich das lokal mache (hostet den Server auf meinem Computer, nicht AWS), läuft es gut. Allerdings, wenn ich den Code zu einer EC2-Instanz bewegen, bekomme ich folgende Fehlermeldung auf dem clientseitige:WebSocket Handshake Fehler mit AWS

WebSocket connection to 'ws://Elastic_IP:8080/?username=name_of_user' failed: Error during WebSocket handshake: Unexpected response code: 500

Ich stellte sicher, dass die EC2-Instanz Datenverkehr auf Port 8080

akzeptieren

Auf der Server-Seite, bekomme ich viele java.lang.NoClassDefFoundError, wenn die Verbindung versucht wird. Ich erhalte diesen Fehler nicht, wenn ich ihn lokal ausführe. Vielleicht gibt es ein Problem, wenn ich auf der EC2-Instanz kompiliere, aber es kompiliert ohne Fehler. Ich kompiliere und führe den Code mit Eclipse lokal aus, aber ich kompiliere und führe den Code auf EC2 von Hand (javac mit vielen Klassenpfaden). Es ist wahrscheinlich, dass ich einen Fehler beim Kompilieren von Hand gemacht habe, aber ich bin nicht sicher, was der Fehler sein könnte.

Jede Hilfe würde sehr geschätzt werden.

EDIT
Nach einer kleinen Fehlersuche auf meiner eigenen, erkannte ich, dass JSON.ParseException die Quelle Problem. Nachdem ich alle Aufrufe dieser Klasse aus dem Servercode entfernt habe, ist der Handshake abgeschlossen und ich konnte eine Verbindung zwischen dem Server und dem Client herstellen. aber ich laufe jetzt in die folgenden Fehlermeldung, wenn ich eine Nachricht von dem Client empfangen:

WARN:MyWebSocketHandler:qtp990368553-16: Unhandled Error (closing connection) 
java.lang.RuntimeException: Cannot call method public void 
MyWebSocketHandler#onMessage(org.eclipse.jetty.websocket.api.Session, java.lang.String) with args: 
[org.eclipse.jetty.websocket.common.WebSocketSession, java.lang.String] 

Es scheint, dass ich das Argument definierte org.eclipse.jetty.websocket.api.Session zu sein, aber während der Laufzeit des Argument ist eigentlich org.eclipse.jetty.websocket.common.WebSocketSession. Irgendwelche Ideen, wie das passiert oder welche (Session vs WebSocketSession) sollte ich verwenden? Die einzige Möglichkeit, die ich brauche, ist das Senden von Zeichenfolgen zwischen dem Server und dem Client.

+0

Könnten Sie den vollständigen StackTrace bereitstellen, damit wir sehen können, über welche Klasse sich gerade die JVM beschwert? Anstatt Eclipse zu verwenden, um Ihren Servercode lokal auszuführen, können Sie ihn auch lokal wie auf der EC2-Instanz ausführen, sodass Ihre lokale Umgebung näher an der der EC2-Instanz liegt. – Castaglia

+0

@Castaglia Ich reparierte das Hauptproblem für den Handshake (Ich musste einen Import auf dem Servercode entfernen, aber es funktioniert auf der lokalen Seite mit dem Import), aber ich treffe einen anderen Straßenblock. Ich habe die Fragen aktualisiert, um mein Unglück zu reflektieren. – skamazin

Antwort

0

Ich habe eine mögliche Lösung für mein Problem gefunden. Durch Eclipse kann ich das Java-Projekt Export in ein lauffähiges Glas ("packen" der Bibliotheken in das Glas). Dann läuft es mit java -jar <jar_filename> auf dem Server funktioniert und die gleiche wie auf dem lokalen Rechner. Allerdings habe ich einige Performance-Probleme festgestellt (langsamer Start), also glaube ich nicht, dass dies die beste Lösung ist, aber es ist eine Lösung.

Verwandte Themen