Forum: PC-Programmierung Kommunikation zwischen Browser und Programm


von Gustl (Gast)


Lesenswert?

Ist es irgendwie möglich zB Firefox/Chrome dazu zu bringen, auf 
eingehende Nachrichten zu lauschen und reagieren (unter Windows)?

Sprich, ich schreibe mir was in Python/C/Perl/wasauchimmer was im 
Hintergrund regelmäßig gestartet wird. Das soll dann Daten (meinetwegen 
json) an den Browser senden können die ich in einem Tab mit zB JS 
auswerten kann.

Mein erster Gedanke war, im Script einen rudimentären Webserver/-socket 
zu starten, aber dann muß das JS im Browser ja zu genau der Zeit pollen, 
wenn das Script läuft. Und wenn ich das Script idlen lasse bis eine 
Verbindung reinkommt, dann überlappen sich Instanzen wenn Browser/Tab 
mal zu sind. Außerdem muß ich bei mehreren Scripten dann auch noch 
verschiedene Ports verwalten. Plus der initiale Lag, denn ich kann ja 
nicht jede Sekunde x Ports überprüfen.

Ach so, alles zusammen soll auf dem gleichen PC laufen, vielleicht macht 
es das leichter.

In meiner Traumwelt hätte ich am Ende ein Verzeichnis mit einer HTML 
Seite und ein paar Skripten was ich so ohne Installationskram nutzen 
kann (ok, außer die Scripte die Aufgabenplanung eintragen).

von Gerald K. (geku)


Lesenswert?

Warum nicht direkt über CUR  HTTP Client abfragen?

https://curl.haxx.se/libcurl/c/example.html

von Roland P. (pram)


Lesenswert?

Die meisten Browser unterstützen schon "push notifications" (google mal 
danach) .
Wirst bestimmt schon auf der ein oder anderen Webseite gesehen haben: 
"Die Seite XY möchte ihnen Benachrichtigungen senden. Zulassen?"
Dabei wird im Browser ein worker Javascript installiert, dass regelmäßig 
eine Webseite abfragt.

Dein Perl/C wasauchuchimmer müsste allerdings über HTTP (ggf sogar 
verschlüsselt) erreichbar sein.

von DPA (Gast)


Lesenswert?

Ich glaube er will einen unsauberen Hack alla "script aufrufen -> öffnet 
Seite in Browser und nimmt Daten vom Skript entgegen, aber nur falls die 
Seite noch nicht offen ist" machen, statt da sauber einfach immer einen 
Server laufen zu lassen, und den als message bus zu verwenden.

Einfach nur eine Seite starten und ein paar Daten mitgeben, da kann man 
an die Datei einfach Daten nach ner # anhängen. Man kann mit sendMessage 
und localStorage in gewissen Browsern mit ein paar hacks und ner 
zwischendatei Daten austauschen, empfehlen würde ich das aber nicht:

a.html
1
<script>
2
function sendMessage(key, message){
3
  localStorage.setItem(key, Math.random().toFixed(8).substr(2) + JSON.stringify(message||null));
4
}
5
if(!location.hash){
6
  window.addEventListener('storage', function(event){
7
    top.postMessage({
8
      what: 'storage',
9
      key: event.key,
10
      value: JSON.parse(event.newValue.substr(8))
11
    },"*");
12
  });
13
}else{
14
  console.log(location.hash.substr(1).split(':',2), location.hash)
15
  sendMessage(...location.hash.substr(1).split(':',2));
16
  window.close();
17
}
18
</script>

b.html
1
<script>
2
function receiveMessage(event) {
3
  console.log(event.data);
4
}
5
addEventListener("message", receiveMessage, false);
6
</script>
7
<iframe src="a.html" style="display:none;"></iframe>

b.html öffnen, dann a.html#test:123 öffnen, in b.html in der Konsole 
wird dann Object { what: "storage", key: "test", value: "123" } 
ausgegeben.

Man kann die Seite dann aber nicht automatisch wieder schliessen...


Eine "sauberere Lösung" wäre wohl sowas wie selenium zu nehmen, wirklich 
schön ist das aber auch nicht.

von Gustl (Gast)


Lesenswert?

Gerald K. schrieb:
> Warum nicht direkt über CUR  HTTP Client abfragen?

Wie soll mir curl helfen?

Roland P. schrieb:
> Die meisten Browser unterstützen schon "push notifications" (google mal
> danach) .

Danke! Werde ich mir ansehen.

DPA schrieb:
> Ich glaube er will einen unsauberen Hack alla "script aufrufen -> öffnet
> Seite in Browser und nimmt Daten vom Skript entgegen, aber nur falls die
> Seite noch nicht offen ist" machen, statt da sauber einfach immer einen
> Server laufen zu lassen, und den als message bus zu verwenden.

Ich möchte einfach eine HTML Seite als so eine Art GUI verwenden. Wenn 
die offen ist, würde ich dort gerne von den Scripten Statusmeldungen oä 
abliefern lassen. Automatisch öffnen will ich nichts.
Dafür wären wohl Websockets da, aber wenn ich alles richtig verstehe 
dann muß ich jedes Skript als Windows-Service mit eigenem Port schreiben 
und installieren. Sowas ist mir für ein bisserl Hobby zu aufwendig.

von Vlad T. (vlad_tepesch)


Lesenswert?

du könntest auch einen vom Script unabhängigen webserver starten und den 
laufen lassen.
Dein script läd seine Ergebnisse bei dem Server ab. Entweder als datei 
oder schreibts in eine Datenbank (hab ja keine Ahnung, was du eigentlich 
machst).

Der webserver liefert einfach eine Seite aus, die alle sekunde oder so, 
guckt, ob was neues da ist 
(https://developer.mozilla.org/de/docs/Web/API/XMLHttpRequest/XMLHttpRequest) 
und aktualisiert die Felder der Seite entsprechend.

Der Webserver könnte natürlich auch komplett selbstgeschrieben sein. 
Dann könntest du ihn auf eine Url mit dem ausliefern der Seite reagieren 
(/get für komplette HTML-Seite oder  /get/key für einzelnen Wert (ohne 
HTML)) lassen und auf eine andere mit dem aktualisieren (set?key=value) 
der auszuliefernden Daten.

von Vlad T. (vlad_tepesch)


Lesenswert?

Gustl schrieb:
> Dafür wären wohl Websockets da, aber wenn ich alles richtig verstehe
> dann muß ich jedes Skript als Windows-Service mit eigenem Port schreiben

quatsch. du kannst auch einen Server schreiben, der je nach parameter 
dir den gewünschten Wert zurückgibt. (siehe obige Antwort)

von Felix (Gast)


Lesenswert?

Ich habe es zwar erst entdeckt und noch nichts damit gemacht. Aber 
dieses "Node Red" könnte vielleicht was für dich sein.

https://nodered.org/

https://youtu.be/vYreeoCoQPI

von Gustl (Gast)


Lesenswert?

Vlad T. schrieb:
> Dein script läd seine Ergebnisse bei dem Server ab. Entweder als datei
> oder schreibts in eine Datenbank (hab ja keine Ahnung, was du eigentlich
> machst).

Einfaches Beispiel: ein Script kopiert jede Stunde eine Liste von 
Dateien (Backup). Im Browsertab sehe ich dann den 0-100% Fortschritt und 
am Schluß ob alles ok war. (Ja, gibt richtige Backuplösungen, aber ist 
nur ein Beispiel).

Was Du beschreibst ist doch ein Polling wo der Browser sekündlich einen 
ajax Request an den Server schickt, der dann eine DB Verbinung aufbaut 
und einen Query macht. Pro Tag also 86400 mal, 86376 mal umsonst. Sowas 
(inkl Serverinstallation) wollte ich halt vermeiden und es gerne simpel 
halten. Daher dachte ich daß man wenigstens lokal irgendwie mit dem 
Browser direkt kommunizieren kann.

von Vlad T. (vlad_tepesch)


Lesenswert?

Gustl schrieb:
> Pro Tag also 86400 mal, 86376 mal umsonst.

na und? wenn man grob 1k pro request rechnet sind das 86MB pro tag.
Wenns lokal ist, juckt es überhaupt nicht.


ansonsten könntest du dir push oder das anschauen:
https://www.developerdrive.com/pushing-updates-to-the-web-page-with-html5-server-sent-events/

von DPA (Gast)


Lesenswert?

Gustl schrieb:
> Dafür wären wohl Websockets da, aber wenn ich alles richtig verstehe
> dann muß ich jedes Skript als Windows-Service mit eigenem Port schreiben
> und installieren.

Nö, ist nicht nötig. So ein server kann z.B. auch ein simples python 
flask script sein, und sowas kann man auch starten, ohne dass es ein 
windows service ist. Die firewall muss es halt erlauben, falls du eine 
hast. Du brauchst ja nicht unbedingt für jedes Script einen neuen 
Server. Du könntest dann z.B. server starten -> darüber Seite aufrufen 
-> Websocket Verbindung zu aufbauen. Bei den Scripts dann einfach dem 
server mitteilen, was sie dem Browser sagen sollen, z.B. mit curl, oder 
in einen Fifo schreiben, den du im Server anlegst, oder sonst wie. Du 
könntest den Server auch so Konfigurieren, unter einer bestimmten URL 
das Script aufzurufen, z.B. localhost:8080/api/start/scriptname. Dann 
würde der Server am Schluss sogar selber wissen, ob das Script sich 
erfolgreich beendet hat, und du könntest den Server einfach stdout oder 
stderr des Prozesses per websocket an den Browser weitergeben, ihm quasy 
sagen '{"what":"script output", "script": "bla.py", "content": "some 
line the script has written to stdout"}'.

von JJ (Gast)


Lesenswert?

HTML kennt auch einen Meta Tag "refresh" damit kannst du die Seite alle 
paar Sekunden neu laden.

von Vlad T. (vlad_tepesch)


Lesenswert?

JJ schrieb:
> HTML kennt auch einen Meta Tag "refresh" damit kannst du die Seite
> alle
> paar Sekunden neu laden.

das ist aber mehr als krude. Dann flackert deine seite alle paar 
Sekunden.
Außerdem holt man so immer die komplette Seite.

mit einem Request nur die Daten zu holen und die einzelnen Felder der 
Seite zu aktualisieren ist viel sauberer und sparsamer

von Pandur S. (jetztnicht)


Lesenswert?

Der Poster hat das Prizip von client/Server noch nicht verstanden.

von Gustl (Gast)


Lesenswert?

Joggel E. schrieb:
> Der Poster hat das Prizip von client/Server noch nicht verstanden.

<loriot>Ach?</loriot>

Mir kommt es eher so vor, als hättest Du das Prinzip nicht verstanden da 
sich Dein "Serverhorizont" bei sowas wie apache, nginx, iis, etc 
erschöpft. In meinem Plan wäre einfach der Browser der Server, und das 
Script der Client.

Aus den Antworten im allgemeinen ziehe ich aber den Schluss, daß Browser 
keine wirkliche Schnittstelle für eingehende Kommunikation haben. Bliebe 
dann halt Push oder SSE.

von Larry (Gast)


Lesenswert?

Frueher hat man fuer sowas einfach Java benutzt.

Ich habe hier z.B. einen (Ethernet-)Terminalserver der per Browser
kontaktiert wird, dann ein Javaapplet laedt, dass dann im Webbrowser
ein serielles HP-Terminal emuliert. Dafuer hat das kleine Kaestchen
dann tatsaechlich eine 25pol. Buchse.
Dieses Beispiel nur, um zu zeigen, dass damit so ziemlich alles
moegliche und scheinbar unmoegliche realisierbar ist.

von Rene K. (xdraconix)


Lesenswert?

Gustl schrieb:
> In meinem Plan wäre einfach der Browser der Server, und das Script der
> Client.

Das geht aber nunmal nicht. Dein Zauberwort... Wie oben bereits 
erwähnt... heißt XMLhttpRequest oder kurz Ajax.

Ein klitzekleiner Webserver und eine Scriptsprache deiner Wahl und gut 
ist. Ich habe so ein Server Info Fenster am laufen. Alle 500ms werden 
auf der Seite sämtliche Daten für RAM, CPUs, Nics und sowas 
aktualisiert. Mit Diagrammen, Progessbars etc...

Übrigens, das beste Beispiel für Ajax ist immer noch die Börse mit ihren 
Kursen.

Alles andere ist nur krude Frimmellei und macht mehr Arbeit als es 
sinnvoll ist.

von Gustl (Gast)


Lesenswert?

Rene K. schrieb:
> Das geht aber nunmal nicht. Dein Zauberwort... Wie oben bereits
> erwähnt... heißt XMLhttpRequest oder kurz Ajax.

Geht nicht gibt's nicht. Ist halt nur eine Frage des Aufwands. Man 
könnte ja auch den Browser patchen...

> Ein klitzekleiner Webserver und eine Scriptsprache deiner Wahl und gut
> ist. Ich habe so ein Server Info Fenster am laufen. Alle 500ms werden
> auf der Seite sämtliche Daten für RAM, CPUs, Nics und sowas
> aktualisiert. Mit Diagrammen, Progessbars etc...

Wären für Dein Infofenster nicht Websockets besser? Wenn Du alle 0,5s 
per Ajax pullst, dann ist es anders rum besser.

> Übrigens, das beste Beispiel für Ajax ist immer noch die Börse mit ihren
> Kursen.

Börsenseiten machen das übrigens schon lange per Websockets. Ist 
performanter und macht weniger Traffic.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.