PHP - TCP-Socket



  • Hallo,

    um mein Problem zu beschreiben, erstmal folgendes:
    Ich möchte eine Software (Client) zeitunabhängig mit einem Server verbinden (TCP), der immer erreichbar ist. Dieser Server soll natürlich programmiert werden können (auf Anfrage a, sende Antwort a).

    Ein lokaler Server auf einem Heimcomputer macht kein Sinn, immerhin resettet der Router die IP-Adresse (mindestens nach einem Stromausfall, PC-Neustart etc.). Das bedeutet: Keine feste IP-Adresse. Also fällt der Heimcomputer als "statischer" Server weg.

    Nun hier angekommen, habe ich mir überlegt, könnte man ja nun einfach einen Webserver für diesen Zweck verwenden. Denn dieser hat im Grunde immer die gleiche IP (durch den Webserver verknüpft mit der Domain, logisch). Außerdem unterstützt dieser Server Skriptsprachen wie PHP. Und nun, mit PHP lassen sich ja auch Sockets eröffnen. Volltreffer!

    Aber hier ergibt sich mir folgendes Problem:

    Die Server.php-Datei (und somit auch der TCP-Server) wird ja nur aufgerufen wenn ich jetzt im Browser (oder auch sonst wie/wo) die Server.php auch wirklich öffne/ausführe. Ich möchte allerdings dass der TCP-Server immer läuft. Quasi auf Webserver-Ebene. Die Server.php wird ja immerhin nur auf "Anfrage" und eben nicht dauerhaft vom Webserver ausgeführt.

    Gibt es also eine Möglichkeit entweder:
    a) Auf Webserver-Ebene zu programmieren
    b) Das PHP-Skript unaufgerufen, dauerhaft auszuführen
    c) Den Server irgendwie "für immer" laufen zu lassen, ohne etwas zu machen?

    Ich weiß dass ich mich irgendwie unverständlich ausdrücke, bekomme es aber besser nicht hin. Ich bin eben noch ziemlicher Anfänger auf dem Gebiet und versuche durchzublicken.

    Vielen lieben netten Dank im voraus!

    Gruß
    fundamental



  • Du bringst da ziemlich viel durcheinander. Warum genau brauchst du denn ein rohes Socket?

    Du kannst den Client jederzeit HTTP-Requests an den Webserver schicken lassen. Auf dem Webserver läuft z.B. PHP oä. und damit kannst du dann Antworten an den Client zurückschicken (entspricht deinem "auf Anfrage a…").



  • Hallo,

    vielen Dank für deine Antwort nman!

    Wäre deine Methode per HTTP nicht in etwa eine asynchrone TCP-Verbindung? Kann man denn von PHP aus eine HTTP-Antwort zum Clienten senden?

    Ich habe gerade eventuell gefunden was ich möchte. "daemon"? Kann das sein? Ich möchte im Endeffekt eine stabile Verbindung haben.



  • Um nen Daemon laufen zu lassen brauchst du nen Server wo du mehr machen kannst als nur PHP Skripte hochzuladen.
    Gibt's natürlich anzumieten, alles kein Problem.

    Ich verstehe nur nicht wieso du meinst eine permanente Verbindung zu brauchen.

    Das "keine feste IP" ist auch nicht wirklich ein Problem. Es gibt js schliesslich sowas wie Dynamic DNS Hoster.



  • Du kannst auch mit Node.js arbeiten, das ist eine Plattform auf Javascript-Basis und du hast den Vorteil der nicht blockierenden Abarbeitung von Anfragen. Es wird also nicht altbacken ein Prozess/Thread für eine Anfrage gestartet, der so lange lebt, bis er zu einer Antwort bereit ist, sondern es können unheimlich viele Anfrage mit nur einem Thread bearbeitet werden. Javascript läuft hier mit einem JIT-Compiler und ist hier unglaublich schnell. Das gesamtem Paket ist meist doppelt so schnell wie ein Apache.

    Hier mal ein Beispiel für einen Minimal-Webserver:

    var http = require('http');
    http.createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end('Hello World\n');
    }).listen(1337, '127.0.0.1');
    console.log('Server running at http://127.0.0.1:1337/')
    

    Es gibt heute viele Werkzeuge die sich exzellent für die jeweiligen Aufgaben eignen. Alles mit dem Schweizer-Taschenmesser machen zu wollen, ist sehr sehr dumm, oder man halt zu viel Zeit und Nerven. Die letzte Möglichkeit ist man kann es nicht anders, weil man nur diese eine Werkzeug einzusetzen vermag. Dann sollte man sich aber auch nicht Entwickler nennen dürfen.

    Es gibt den schönen Spruch "Komplexität mindert die Zuverlässigkeit", also mache alles so einfach wie möglich, folge dem KISS-Prinzip. Vermeide hochkomplexe Sprachen wie C++, wo es nur geht. Manchmal geht es nicht anders, aber meistens gibt es mittlerweile viel bessere Lösungen, als nun für alles C++ zu nehmen. Wir sind nicht mehr in den 90er, sondern 2014. Allein in den letzten Jahren hat sich sehr viel getan und wer neue Entwicklungen verpennt, oder auch verkennt, der sollte in Rente gehen.



  • Nodejs: Der OP hat ganz andere Probleme als welches Framework in seinem Fall am günstigsten ist. Warte lieber ab bis er sich mal über die Anforderungen im Klaren ist, bevor du Node.js empfiehlst.



  • fundamental schrieb:

    Ich möchte im Endeffekt eine stabile Verbindung haben.

    Die große Frage ist: Was soll denn über diese Verbindung überhaupt laufen?



  • Hallo,

    bitte entschuldigt die verspätete Antwort, ich wollte nicht respektlos wirken aber ich habe erst nochmal über den HTTP-Vorschlag nachdenken müssen.

    HTTP würde ich schon gerne benutzen, allerdings sehe ich da einige Probleme.

    Was ich konkret möchte:
    Der Anwender startet die Software, und connected automatisch zu meinem Server. Daraufhin möchte ich live von meinem Webserver aus mit dem Klienten kommunizieren.

    Wahrscheinlich wäre es das simpelste, wenn man Status-Handler tippt. Client connected/Client disconnected.

    Ich weiß dass ich mich unglaublich unmissverständlich ausdrücke, ich gebe mir jedoch schon einiges an Mühe um mein Problem so gut wie möglich zu beschreiben. Bitte entschuldigt mir das.

    Und ein herzliches Danke schön an alle die mir helfen möchten! Ihr seid klasse! 🙂


  • Mod

    Was heisst "live" kommunzieren?

    zB Twitter oder Facebook - das ist live Kommunikation.

    Du solltest eher abtstrakter Erklären was du tun willst und nicht wie du es tun willst.



  • Okay, abstrakt erklärt:

    Ich habe einen Computer bei meiner Mutter. Wenn meine Mutter den Computer startet, möchte ich dass meine Software sich automatisch mit meinem Webserver verbindet.

    Gehe ich auf meinen Webserver (Interface, bzw. GUI), möchte ich sehen "Computer A bei Mutti online".

    Ziel soll es sein, Infos und Daten, per live-Anfrage (vom Webserver aus), von dem Computer zu dem Webserver zu senden.



  • Ich benutze bei einem Webinterface eine Serveranwendung und WebSocket.
    Der Server benutzt dazu einen POCO Websocket (hier C++, aber andere Sprachen haben sicher auch was nettes, ansonsten das gröbste selbst implementieren) Server, mit dem sich die Seite synchronisiert.

    Das benötigt natürlichen mindestens einen V-Server und nicht nur eine Page mit FTP.

    EDIT: haha, FTP. wird als link erkannt, das war nicht geplant.


  • Mod

    Für mich klingt das wie wenn ein simples Webservices ausreichen würde.



  • Shade Of Mine schrieb:

    Für mich klingt das wie wenn ein simples Webservices ausreichen würde.

    Ok, von mir aus gerne. Und was wäre so ein simples Webservice?

    Danke im voraus!


  • Mod

    fundamental schrieb:

    Shade Of Mine schrieb:

    Für mich klingt das wie wenn ein simples Webservices ausreichen würde.

    Ok, von mir aus gerne. Und was wäre so ein simples Webservice?

    Danke im voraus!

    Einfach ein PHP oder was auch immer Skript dass die Inputs des Clients entgegen nimmt. Wozu muss eine konstante Verbindung bestehen?


Log in to reply