Autor Beitrag
anthoney
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 03.02.07 15:40 
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.

/
ausblenden 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
ausblenden Delphi-Quelltext
1:
2:
    Socket.Close;
    ServerSocket1.Listen();


Danke lg
anthoney

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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:

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
anthoney Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Sa 03.02.07 18:21 
der idHTTPServer ist eine Komponente aus den [url=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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 05.02.07 01:14 
Moin!

user profile iconanthoney hat folgendes geschrieben:
ausblenden 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 gesagt, möglich - aber sicher nicht bei deinem Wissensstand in Sachen Sockets... :( nicht persönlich nehmen, bitte. ;)).

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.