Entwickler-Ecke

Internet / Netzwerk - PHP fsockopen() an idTCPServer


sutaro - Mi 27.04.05 12:09
Titel: PHP fsockopen() an idTCPServer
hi
ich hab schon überall gesucht, aber nichts finden können was mir hilft...

also, ich habe auf meinem webserver ein php-script, in dem folgendes steht:

Quelltext
1:
2:
3:
$fp = fsockopen($ip,$port);
fwrite($fp,$text);
fclose($fp);


in meinem delphi-programm habe ich einen idTCPServer. Die Verbindung wird erkannt (onConnect wird ausgeführt) aber der gesendete text wird nicht empfangen.


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
Label1.Caption:= AThread.Connection.ReadLn()
end;


in das Label wird immer ein leerer String geschrieben?!
wieso wird der text vom server nicht empfangen?

danke schonmal :!:


huhn - Mi 27.04.05 12:27

mach mal mit anführungszeichen :wink:

Delphi-Quelltext
1:
2:
3:
begin
form1.Label1.Caption:= AThread.Connection.ReadLn('');
end;

//feedback wär nett!
mfg huhn


sutaro - Mi 27.04.05 13:15

funktioniert leider genausowenig :(


huhn - Mi 27.04.05 13:57

upps sorry war beim client! :oops:
ne ähmm dann musst du nur die klammer weglassen:

Delphi-Quelltext
1:
2:
3:
begin
form1.Label1.Caption:= AThread.Connection.ReadLn;
end;

dann müssts klappen.
mfg huhn


sutaro - Mi 27.04.05 14:03

danke für deine hilfe, aber es geht immer noch nich...


huhn - Mi 27.04.05 14:04

Bohh du machst mich schwach!
Poste mal deinen gesammten code, ich glaub da liegt wo anders der fehler


huhn - Mi 27.04.05 15:14

hab mir nomal deinen ersten post gelesen, ich glaube du solltest nicht Tcpserver sondern eine webkomponente benützen!nimm mal die idhttp komponent und lad dort die seite,verarbeite die!Ich bin leider au net so gewandt in sachen php, aber bist du sicher das des stimmt was du geschrieben hast?

Quelltext
1:
2:
3:
$fp = fsockopen($ip,$port);  //ok hier werden der variable die daten übergeben
fwrite($fp,$text);           //hier wird was an die 
fclose($fp);              //fp-variable/verbindung geschickt, aber was soll $text ? text ist leer oder??sag lieber mal 'hallo' oder so und dann probiers nomal

also wennschon probierst nomal wie ichs dir geschrieben hab oder du nimmst die idhttp kompo
mfg huhn


sutaro - Mi 27.04.05 19:15

also an dem code kann eigendlich nix anderes falsch sein, weils nix anderes gibt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer;

type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    Label1: TLabel;
    Label2: TLabel;
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure IdTCPServer1Connect(AThread: TIdPeerThread);
    procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
Form1.Label1.Caption:= AThread.Connection.ReadLn;
end;


der php-code müsste auch so stimmen ($text ist nicht leer, und ich habs auch schon direkt mit fwrite('hallo'); probiert)
und mit idhttp kann ich nix anfangen, weil ja das php-script bei einem bestimmten ereignis etwas an mein programm senden soll und nicht umgekehrt!

ich versteh des nich :?


huhn - Mi 27.04.05 19:54

Ja lol da fehlt aber einiges!!! der muss doch erst mal ne verbindung aufbauen oder?wenn keine verbindung besteht wird er auch nie was ausgeben!
ich kenn mich net so gut mit tcpserver aus, da ich bis jetzt immer mit dem client gearbeitet habe. Die frage ist sowieso ob du eine art html(php) soaus einem programm mit dem tcpserver laden kann. erkundige dich mal hier im forum unter idhttp und so, mit dem lädt man seiten aus dem internet. mit dem tcpserver machst du eine direktverbindung zu einer ip....ach ist viel zu viel zum erklären! les dir mal am besten hier die tutorials durch:
http://www.dsdt.info/tutorials/indy/
hier mal des zum http!:
http://www.dsdt.info/tutorials/indy/?page=5
ich hoffe die helfen dir weiter(glaub du bist en bissle falsch an die sache gegangen!)
mfg huhn


huhn - Mi 27.04.05 20:18

ok habs jetzt für dich fertig gemacht und getestet, da mein server leider einen befehel nicht erlaub hats er net gemacht aber es hat funktioiniert!
hier also der billige text!

Du brauchst keinen server sondern nur die Idhttp komponente von Indy:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button11Click(Sender: TObject);
var   s:string;
begin
  s:=idhttp1.Get('http://huhnau.hu.funpic.de/server.php');//gibt dem s den wert der seite
  memo1.Lines.Add(s);//was du mit ihm machst bleib dir überlassen!
  label1.caption:=s;//was du machen willst!
end;

also ich glaub hiermit ist die frage geklärt! puhh
freut mich das ich dir helfen konnte!
mfg huhn


sutaro - Mi 27.04.05 21:01

vielen dank nochmal für deine hilfe, echt, aber du hast mein problem nicht wirklich verstanden!
mit idHTTP kann ich doch nur eine seite vom webserver anfordern. ich will aber, dass mein php-script wenn es von irgendjemanden ausgeführt wird etwas an mein programm sendet. mein programm weis also gar nicht wann es etwas zu empfangen gibt!!! desshalb brauch ich ja den server!
und dass keine verbindung aufgebaut wird: der idTCPServer läuft (ist active) und dann baut mein php-script über fsockopen eine direkte verbindung über meine lokale IP auf.
wie ich ja auch bereits geschrieben habe wird die ankommende verbindung ja auch erkannt, nur die daten werden nicht empfangen, und das ist mein problem!

aber trotzdem nochmal vielen dank für deine bemühungen!


huhn - Mi 27.04.05 21:16

dann setz des doch in nen timer aber anders wird des richtig kompliziert! hast des überhaupt mal ausprobiert?du bekommst schon des zurück was du angefordert hast! nämlich deinen text!
du kannst auch noch eleganter machen und einen thread mit speedbremse machen!
ach und dein kurzer codeschnipsel von php wird dir nie was zurückschicken wenn du es nicht anforderst! was meinst wenn des gehen würde,würden sich viren verbreiten, microsoft hätte rissen probleme .......
machs lieber wie ichs dir gesagt habe!
des is doch ne einmalige abfrage oder?poste au mal den gesammten phpcode!
mfg huhn

ps.:wenn du richtig mit dem server kommunizieren willst dann brauchst auch ein ausgeführtes kommu.Programm auf dem server


Timi-loader - Sa 17.12.05 21:10

hallo
ich stehe jetzt genau vor dem selben problem...

wollte nun fragen ob du evtl jetzt eine lösung gefunden hast?

bei mir geht es auchnur in so fern dass er bei onexecute irgendwie mein memo nur leert also anscheinend mit leeren strings füllt...
ich hab das readln mit klammern gemacht... aber gibt irgwendiwe probs..
also so: ...readln(0);
da müsste ja 0 eigendlich für die 1. zeile stehen oder..
jedenfalls hängt sich mein prog auf

wäre dankbar über antworten :-)

mfg
TLP


caedes - So 25.12.05 18:46

@ huhn: Du hast das Problem immer noch nicht verstanden. Man kann php für mehr als das Anzeigen von Webseiten nutzen. sutaros Idee ist durchaus legitim, um die Verbindung zwischen Web und eigener Delphiapplikation, die vielleicht zuhause mit dyn. IP läuft, zu schaffen. Was du jedoch dann noch vorschlägst, ist wohl eher mehr als unsinnig...

@ alle anderen: Ich hab sowas letzt auch gemacht und es funktioniert bei mir. Sichtbarer Unterschied ist, dass ich im php-Code mit fputs arbeite, ich weiß aber nicht, ob es daran liegt. Außerdem habe ich noch den entscheidenden Ausschnitt aus der Delphi-Source angehängt. Ich arbeite da jedoch mit den Sockets, müsste aber anders auch gehen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
$fp = @fsockopen (84.164.234.201,25,&$err,&$errd,10);
if (!$fp) 
{
  echo "Konnte keine Verbindung herstellen";

else 
{
  echo "Nachricht wurde gesendet";
  fputs ($fp, "HELO");
}



Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.ServerSocket1ClientWrite(Sender: TObject;
  Socket: TCustomWinSocket);
begin
richedit1.Lines.Add(socket.ReceiveText);
end;