Kommunikation "normaler PC" mit lokaler Software an "Cloud Service" und umgekehrt

internet

Top Contributor
Hallo,

ich habe eine Frage wie so etwas funktionieren kann?

Angenommen, ich habe:
  • Eine Webapp, die lokal auf meinem Rechner läuft (bspw. localhost:8080/myapp).
  • Nun möchte ich mit einer Remote Software diese App ansteuern. Bpsw. einen Parameter verändern oder ähnliches.

Das heißt: die lokale App kommuniziert mit derm Server (Cloud Service).
Aber wie kommuniziert der Server (Cloud Service) mit der lokalen App?

Also ich kann mir aktuell nur vorstellen, dass die lokale App ständig Anfragen gegen die Cloud Server macht (Poll) und dann so von den Änderungen mitbekommt.
Oder woher weiß der Cloud Service IP etc. von meinem lokalen PC?

Vielen Dank.
 
ah, danke.

Ich verwende JSF und hier gibt es Omnifaces, die Websockets anbieten:

Nur wie sieht das dann in der Theorie genau aus?
- Ich sage in der Cloud - WebApp "Starte Session"
-> Was genau passiert dann?

Wie muss das konfiguriert sein?
 
Generell ist die Verbindung zurück vom Server zum "Client" (So nenne ich es mal) so nicht wirklich abbildbar, denn vom Netzwerk ist es meist nicht möglich, hier eine direkte Verbindung aufzubauen. (z.B. weil der Client hinter einem NAT Router steckt, wobei da oft auch Firewalls und Proxies eine Rolle spielen können)

Daher bleibt tatsächlich nur als Möglichkeiten:
a) Du baust einen Kanal auf, der in beide Richtungen geht. Das wäre mit die perfekte Lösung und WebSockets bieten sich da durchaus an (wie von @Jw456 richtig bemerkt).
b) Das "Polling" ist ansonsten aber auch nicht unüblich in vielen Fällen. Die Frage ist einfach, wie wichtig eine Information ist und wie schnell darauf reagiert werden muss.

Das findet man dann teilweise auch in deutlich komplexeren Strukturen, die sowas implementieren. So gibt es MQ (Message Queuing) Lösungen: Da wird dann eine Nachricht in den Pool gestellt und ist dann bereit für Clients zum abholen. Da werden dann gewisse Dinge sicher gestellt a.la. Nachrichten gehen nicht verloren, es kann n:m Beziehungen geben (N-Server stellen Nachrichten ein und m Clients können diese abholen.) u.s.w.
Je nachdem, was Du brauchst, kann man auch in dem Bereich weiter recherchieren.
 
ah, danke.

Ich verwende JSF und hier gibt es Omnifaces, die Websockets anbieten:

Nur wie sieht das dann in der Theorie genau aus?
- Ich sage in der Cloud - WebApp "Starte Session"
-> Was genau passiert dann?

Wie muss das konfiguriert sein?
Deine Cloud stellt den WebSocket zur Verfügung. Die lokale Web Applikation verbindet sich dann. Die Verbindung geht also weiter von Deiner lokalen App aus (die ja hinter einem Proxy, NAT Router, Firewall, was auch immer sein kann).

Evtl. hilft zum Verständnis eine Erläuterung von WebSockets, damit klar wird, was da passiert?
 
klar, Polling würde funktionieren - wäre aber eher nur die Notoption.

Prinzipiell geht es darum, dass ich ein Gerät habe (mein Client), auf der eine Web App Software läuft. Nun würde ich aber gerne von außerhalb die Möglichkeit haben das Gerät (nicht auf OS - Ebene (sonst wäre Teamviewer etc. auch ausreichen), sondern nur die Webapp) zu steuern.

Das heißt:
-> Es wird eine Verbindung aufgebaut.

Die connectMe.jsf - Seite auf dem Server hat dann u.a. den Omnifaces Code:
Java:
<o:socket channel="someChannel" user="#{myBean.deviceId}" ... />
deviceId wird ja als Parameter geholt.

Auf dem Cloud Server kann ich ja Nachrichten dann schicken:
Code:
@Inject @Push
private PushContext someChannel;

public void sendMessage(Object message, User recipientUser) {
    Long recipientUserId = recipientUser.getId();
    someChannel.send(message, recipientUserId);
}

Aber wie sende & empfange ich dann vom Client Nachrichten zurück an den Server?
Was muss hier von Omnifaces eingebaut werden? Die Implementierung auf den lokalen WebApp ist mir dann nicht ganz klar.
 
also wie gesagt so ganz klar ist das mir nicht, wie die lokale Web App die Nachrichten empfängt / sendet bzw. diese dann weiterverarbeitet.
Senden kann ich mir noch vorstellen via an einen Webservice von der Cloud App zu senden.

- Ich erhalte eine Nachricht vom Websocket der Cloud App zurück. Das heißt die lokale Web App ist auf der Seite gerade drauf: https://mycloudcmpany.com/connectMe.jsf?deviceId=123456789

Aber wie kann ich nun eine Methode in der lokalen Web App starten.
Also ich muss ja nun irgendwie eine Verknüpfung in die lokale Web App bekommen? Wie soll das gehen?
 
Lies dir nochmal alles zum Thema websockets durch. Das ist eine bidrektionale Kommunikation.

Das ist einfach eine Verbindung die nicht - wie beim normalen HTTP Aufruf - direkt danach geschlossen wird, sondern einfach dauerhaft offen ist.
 
Ja, ist ja quasi wie ein Chat.
Ich sehe aber das Problem, dass ich mit zwei unterschiedlichen Applikationen kommunizieren muss, wobei:
  • Die lokale Web App einfachen Zugriff auf die WebApp in der Cloud hat
  • Die Cloud App aber keinen direkten Zugriff auf die lokale Web App hat.

Einen Websocket via Omnifaces herzustellen habe ich oben probiert aufzuzeigen.
Das Problem ist aber nun für mich, wie ich die Nachrichten, die die lokale WebApp empfängt weiter verarbeite, sodass eine Funktion etc. in der lokalen WebApp gestartet wird.
Vereinfacht gesagt kann ich ja nicht von der Cloud WebApp bpsw. ein bestimmtes Programm auf dem lokalen Client öffnen. Oder wie geht das?

Bspw. ist die lokale Web App dann auf der Seite connected und können miteinander kommunizieren.
https://mycloudcmpany.com/connectMe.jsf?deviceId=123456789

Dort ist ja dann sowas implementiert, wie der Code unten... Die lokale WebApp empfängt dann Nachrichten.
Java:
<o:socket channel="someChannel" onmessage="socketListener" />

Jetzt will ich aber, dass eine Funktion in der lokalen WebApp ausgeführt wird.
Wenn ich nun via "actionListener" eine Funktion aufrufe, dann läuft die doch in der Applikation von der Cloud App.
 
Das ist auch nur ein Beispiel.
Ich will hier ein JSON Objekt entgegen nehmen und dann irgendwas verrücktes machen
Dann mach das doch! Wo ist das Problem? Du bekommst Text-Nachrichten. Darin kann beliebiges stehen. Du kannst Daten in eine beliebige Textform bringen. Und heya - JSON ist ein Format, das in solch einer Textform daher kommt!

Dann musst Du mal ggf. prüfen: Kommen Nachrichten 1:1 an oder ist es wie bei Sockets / deren Streams, dass da alles einfach aneinander gehängt und dann in beliebigen Paketgrößen versendet wird. Ggf. ist das ein zusätzlicher Aufwand, der aber auch nicht sonderlich komplex ist.
 
Welche maven dependency nimmt man denn standardmäßig? Wirklich diese Eclipse Tyrus?
Was nutzt du denn sonst noch an Abhängigkeiten? Evtl. hat das Framework, das Du nutzt, schon eine Implementation - dann würde ich schlicht bei der bleiben. Die API ist in JSR 356 festgelegt und es gibt viele Implementationen. Tyrus ist wohl die Referenz Implementation. Aber wenn Du z.B. auf Tomcat setzt, dann solltest Du auch die Implementation von Tomcat nutzen (IMHO).
 

Zurück
Oben