Entwickler-Ecke

Internet / Netzwerk - TServerSocket - Kommunikation Firefox mit TServerSocket -


anthoney - Sa 03.02.07 15:40
Titel: TServerSocket - Kommunikation Firefox mit TServerSocket -
Ich habe ein kleinen Server geschrieben, der von einem Browser (firefox oder IE) eine Anfrage erhält.

Der Server soll nur eine kurze Nachricht zurückschicken.
Ich verwende dafür die Komponente TServerSocket.

// ====================================================================

Die Komponente ServerSocket1 von TServerSocket wird mit
Port=8002
ServerType=stNonBlocking
erzeugt.

/

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:
/ ====================================================================
Der folgende Code-Schnipsel macht mir Probleme:
// --------------------------------------------------------------------
var
  Bfr: array of byte;
  BufSize: Cardinal;

// Reaktion auf Ereignisse
procedure TForm1.ServerSocket1ClientWrite(Sender: TObject;
  Socket: TCustomWinSocket);

begin
  BufSize := Socket.ReceiveLength div SizeOf(Byte);

  Bfr := nil;
  SetLength(Bfr, BufSize);
  Socket.ReceiveBuf(Pointer(Bfr)^, BufSize);

end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i : integer;
begin
  i := Socket.SendText('Hallo vom Server');

end;

// ====================================================================

Wenn ich meinen Firefox oder Internet-Explorer so einrichte, dass sie nicht direkt auf das Netz zugreifen, sondern auf den Port des hier geschriebenen Servers,
so funktioniert die Methode ServerSocket1ClientWrite ohne Probleme.

Die Methode ServerSocket1ClientRead funktioniert auch, aber nicht sofort.
Erst wenn ich den Server beende, zeigt der Browser den Text "Hallo vom Server" an.

Daher meine Frage: Gibt es so etwas wie Socket.Flush(); damit der Browser den Text sofort anzeigt?

Was nicht funktioniert

Delphi-Quelltext
1:
2:
    Socket.Close;
    ServerSocket1.Listen();


Danke lg
anthoney

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt


jakobwenzel - Sa 03.02.07 16:28

Die Sockets sind darauf ausgelegt, die Verbindung offen zu halten, zb. für Netzwerkspiele. Bei HTTP wird die Verbindung aber gleich wieder getrennt, was du dann auch machen musst.

PS: Spricht irgendwas gegen idHTTPServer? :wink:


anthoney - Sa 03.02.07 18:06

Danke für die Antwort.

Doch wie gesagt

//
Socket.Close;
//

funktioniert nicht.

Wie kann ich da die Verbindung beenden, und das weiterhin eine neue Verbindung zum Server aufgebaut werden kann. Denn wenn ich close verwende, komme ich nicht zum Ziel und niemand kann mehr auf den Server zugreifen.

"idHTTPServer" ist keine Standardkomponente oder?
Ich kenne sie jedenfalls nicht.
Wo kann ich mehr über sie erfahren?

Ich will jedoch möglich nicht auf fertige http-Komponenten sondern das ganze nativ durchführen. Zum Teil um etwas Erfahrung zu sammeln. Eventuell auch für mein besonderes Problem.

LG anthoney


matze - Sa 03.02.07 18:21

der idHTTPServer ist eine Komponente aus den [url=http://www.indyproject.org]Indys[/url], die dir einen kompletten HTTP server mit seeeeehr vielen Kontroll- und Einstellmöglichkeiten bietet.

Also ich würde dir die auch empfehlen.


Narses - Mo 05.02.07 01:14

Moin!

user profile iconanthoney hat folgendes geschrieben:

Delphi-Quelltext
1:
Socket.Close;                    

funktioniert nicht.

Doch, das funktioniert schon ganz gut, allerdings nicht auf die Weise, wie du mit den Sockets arbeitest 8) ;) Bist du sicher, dass du die Funktionsweise dieser Komponenten ausreichend verstanden hast? :gruebel: :mahn:

user profile iconanthoney hat folgendes geschrieben:
Wie kann ich da die Verbindung beenden, und das weiterhin eine neue Verbindung zum Server aufgebaut werden kann. Denn wenn ich close verwende, komme ich nicht zum Ziel und niemand kann mehr auf den Server zugreifen.

Weil du vermutlich den listening Socket schließt, statt die aktuelle Client-Verbindung. ;)

user profile iconanthoney hat folgendes geschrieben:
Ich will jedoch möglich nicht auf fertige http-Komponenten sondern das ganze nativ durchführen.

Warum auch immer du das möchstest, aber bei deinen bisherigen Code-Beispielen zu den Sockets würde ich dir auch ganz dringend zum IdHttp raten. :D Leider ist die Aufgabe, einen HTTP-Server per Sockets zu realisieren, alles andere als "leicht" zu nennen... :| und non-blocking sowieso... :( (wie schon im anderen Thread [http://www.delphi-forum.de/viewtopic.php?t=69446] gesagt, möglich - aber sicher nicht bei deinem Wissensstand in Sachen Sockets... :( nicht persönlich nehmen, bitte. ;)).

cu
Narses