Eclipse WebSocket programmiert, kann es leider nicht testen.

B

Brotchips

Mitglied
Hallo alle zusammen,

aufgrund einer Studienleistung die ich bald abgeben muss, habe ich eine Laborübung gemacht. Bei der soll man als erstes eine nebenläufige Klasse namens SensorSimulator erstellen. Von ihr wird der Server-Endpunkt später für jede Verbindung eine Thread-Instanz starten. Diese liefert dann die Messwerte die ausgegegeben werden sollen usw.


Java:
package var.web.ws.sensor;

import java.io.IOException;
import java.util.Random;

import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;

public class SensorSimulator extends Thread {

    private Session session;
    private Random random;
    private double messwert;

    public SensorSimulator(Session session) {
        super();
        this.session = session;
        random = new Random();
        messwert = 100.0;
    }

    public double getMesswert() {
        return messwert;
    }
   
    @Override
    public void run() {
        try {
            while (session != null && session.isOpen()) {
                sleep(random.nextInt(1000));
            }    if(random.nextBoolean()) {
                messwert += 0.1;
                notifyClient();
            } else {
                messwert -= 0.1;
                notifyClient();
            }
        } catch (InterruptedException | IOException e) {
            e.printStackTrace();
        }

    }
   
    public void notifyClient() throws IOException {
        RemoteEndpoint.Basic client = session.getBasicRemote();
        String message = String.format("%.2f", messwert);
        client.sendText(message);
    }

}

Der Server-Endpunkt heißt MessungsService. Diese Klasse soll nun die Sensormesswertänderungen an den Client senden.

Code:
package var.web.ws.sensor;

import javax.websocket.OnClose;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;



@ServerEndpoint("/messungen")
public class MessungsService {

   
    @OnOpen
    public void open(Session session) {
        SensorSimulator sensor = new SensorSimulator(session);
        session.getUserProperties().put("sensor", sensor);
        sensor.start();
    }
   
   
    @SuppressWarnings("deprecation")
    @OnClose
    public void close(Session session) {
SensorSimulator sensor =
    (SensorSimulator) session.getUserProperties().get("sensor");
sensor.stop();
session.getUserProperties().remove("sensor");
    }
   
   
   
   
   
   
   
   
}

Hinzu kommt jetzt noch eine HTML Seite, die zwei buttons zur verfügung stellen (connect & disconnect). Diesen buttons habe ich JavaScript-Funktionen zugewiesen, um eine Verbindungsauf/abbau zu schaffen.
HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Client für Sensormessungen</title>
<script>

var uri = 'ws://localhost:8080/VAR-07-01_WS/messungen';
var socket;
function $(a) {
    return document.getElementById(a);
}

function connect() {
    socket = new Websocket(uri);
    socket.onmessage = function(message) {
        $('data').innerHTML = "letzte Messung: " + message.data;
    };
}
function disconnect() {
    socket.close();
}

windows.onunload = function() {
    socket.close();
}

</script>
</head>
<body>
    <button onclick="connect();">Connect</button>
    <button onclick="disconnect();">Disconnect</button>
    <div id="data">&nbsp;</div>
</body>
</html>


Bitte davon ausgehen, das die Syntax fehlerfrei ist (da identisch zur Lösung vom Prof.)...
Ich arbeite übrigens mit JAVA EE IDE & Tomcat 7.xx

Nun mein Problem:
Sobald ich die HTML Datei mit run as --> run on Server starte, erscheinen die buttons. Aber wenn ich auf connect klicke, passiert nichts. Kann mir da jemand weiterhelfen bitte? Wie testet man Websockets genau?

Danke im vorraus
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Im wesentlichen genau so, wie du es machst.

Dein Server funktioniert einfach nicht - du hast da einen ziemlich heftigen Bug drin, der das führt das genau gar nichts passiert (Unitest - *hint hint*).
Willst du den Fehler direkt serviert bekommen oder selbst finden?
 
B

Brotchips

Mitglied
Wenn du ihn mir sagen würdest wäre ich sehr dankbar :) Sitze schon so lange dran...
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Formatier mal run den Konventionen entsprechend.

BTW: Thread ist nicht zum extenden da ;)
 
B

Brotchips

Mitglied
Meinst du eventuell so:
Java:
    public void run() {

        while (session != null && session.isOpen())

            try {
                if (random.nextBoolean()) {
                    messwert += 0.1;
                } else {
                    messwert -= 0.1;
                }
                notifyClient();

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

Auch so kein ergebnis...
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Du solltest noch mal den JavaScript-Code durchgucken, der ist syntaktisch nicht korrekt ;)
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
window.onUnload und WebSocket, da hätte schon einmal den Debugger angucken gereicht ;)
 
B

Brotchips

Mitglied
HTML:
    function connect() {
        socket = new WebSocket('ws://localhost:8081/VAR-07-01_WS/messungen');
        socket.onmessage = function(message) {
            $('data').innerHTML = "letzte Messung: " + message.data;
        };
    }

Ich weis nicht genau was du meinst, habe jetzt als Parameter für den Konstruktor direkt die uri eingegeben. es tut sich nichts
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Die groß und Kleinschreibung und das überflüssige 's', bei mir läuft's damit
 
B

Brotchips

Mitglied
Habe das s entfernt. Groß und kleinschreibung passt. Doch es tut sich nichts wenn ich auf connect klicke!!!!!
 
B

Brotchips

Mitglied
Nachdem ich run as --> run on server auf HTML Seite mache, kommt die Frage Run On Server. Hier habe ich einen Tomcat Server v7.0 zur Auswahl. Dieser sollte eigentlich auch funktionieren da die alten SL darüber liefen. danach klicke ich auf finish und der server startet.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Und deinen Javacode startest du auch irgendwie?

HTML aufm Server zu starten macht irgendwie wenig Sinn, HTML ist ja der Client...
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Dann wird es einfach daran liegen, dass dein Listener nicht läuft.
Entweder weil du den Code dazu gar nicht hast, oder weil du ihn nicht startest. An dem hier gezeigtem Code liegt es auf jeden Fall nicht, ich würde einfach mal den Betreuer fragen, woran es liegt
 

Ähnliche Java Themen

Anzeige

Neue Themen


Oben