Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdSimpleServer: Wie Daten senden? (https://www.delphipraxis.net/28938-idsimpleserver-wie-daten-senden.html)

DevilsCamp 1. Sep 2004 14:02


IdSimpleServer: Wie Daten senden?
 
Kann mir einer von euch erklären, wie ich die Komponente TIdSimpleServer mit einer TIdTCPClient Komponente nutzen kann?

Ich kann zwar connecten, aber keine Daten senden...

Dax 1. Sep 2004 14:04

Re: IdSimpleServer: Wie Daten senden?
 
Ich hab' Indy im Moment nicht auf dem Rechner, aber kuck mal, ob es ein Write***() in der Komponente gibt. Wenn es nicht DIREKT in der Komponente verbaut ist, sollte es unter Connection.Write***() sein.

DevilsCamp 1. Sep 2004 16:16

Re: IdSimpleServer: Wie Daten senden?
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, IdTCPClient, IdBaseComponent, IdComponent,
  IdTCPConnection, IdSimpleServer;

type
  TForm1 = class(TForm)
    IdSimpleServer1: TIdSimpleServer;
    IdTCPClient1: TIdTCPClient;
    Button1: TButton;
    ProgressBar1: TProgressBar;
    CheckBox1: TCheckBox;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure IdSimpleServer1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    procedure IdSimpleServer1WorkBegin(Sender: TObject;
      AWorkMode: TWorkMode; const AWorkCountMax: Integer);
    procedure IdSimpleServer1Status(ASender: TObject;
      const AStatus: TIdStatus; const AStatusText: String);
    procedure IdSimpleServer1Disconnected(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   if IdTCPClient1.Connected then begin
      IdTCPClient1.Disconnect;
      Button1.Caption   := '0';
   end else begin
      IdTCPClient1.Connect(2500);
      if IdTCPClient1.Connected then
         Button1.Caption   := '1'
      else
         Button1.Caption   := '0';
   end;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
   if CheckBox1.Checked then
      IdSimpleServer1.Listen
   else
      IdSimpleServer1.EndListen;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   if IdTCPClient1.Connected then
      IdTCPClient1.WriteLn(Edit1.Text);
end;

procedure TForm1.IdSimpleServer1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
   Caption   := IdSimpleServer1.ReadLn(#$A, 2500);
end;

procedure TForm1.IdSimpleServer1WorkBegin(Sender: TObject;
  AWorkMode: TWorkMode; const AWorkCountMax: Integer);
var
   i   : Integer;
begin
   i   := 0;
end;

procedure TForm1.IdSimpleServer1Status(ASender: TObject;
  const AStatus: TIdStatus; const AStatusText: String);
var
   i   : Integer;
begin
   i   := 0;
end;

procedure TForm1.IdSimpleServer1Disconnected(Sender: TObject);
begin
   IdSimpleServer1.EndListen;
   CheckBox1.Checked   := false;
end;

end.
Dieses ist mein Programm.
Es beinhaltet sowohl einen SimpleServer als auch ein TIdTCPClient. Ziel ist es, einem kleinen, ICQ-ähnlichem Programm die Möglichkeit zu geben, Dateien zu versenden.
Leider reagiert der IdSimpleServer weder auf das OnStatus Ereignis, noch auf OnWork, OnWorkBegin oder OnWorkEnd.
Daher kann der Server nicht erkennen, ob ein Client connected ist und Daten sendet.

Vielleicht kann mir jemand helfen...

Dax 2. Sep 2004 14:38

Re: IdSimpleServer: Wie Daten senden?
 
In diesem Fall solltest du keinen IdSimpleServer benutzen, sondern die TIdTCPClient.WriteFile() - FUnktion nutzen. DIese FUnktion öffnet eine Datei auf einem Datenträger und versendet sie binär an den Server, der kann das ganze dann verarbeiten/weiterleiten/etc.

DevilsCamp 2. Sep 2004 16:11

Re: IdSimpleServer: Wie Daten senden?
 
nur was nutzt es mir, wenn ich beim der Server-Komponente keine Möglichkeit habe zu überprüfen, ob der Client gerade was sendet?

Ich muss ja schliesslich der Server-Komponente sagen, wo er die Datei dann abspeichern soll...

Dax 2. Sep 2004 16:49

Re: IdSimpleServer: Wie Daten senden?
 
Sende dem Server doch verher sowas:


Code:
/getfile saveat:C:\my.file response:no endresponse:yes
Das "response" ist bewusst angefügt, damit man dem Server mitteilt, ob er erst bestätigen soll, das er die Datei erhalten kann.
Das "endresponse" ist dafür gedacht, dem Client zu sagen "Datei ist angekommen".

DevilsCamp 2. Sep 2004 16:58

Re: IdSimpleServer: Wie Daten senden?
 
Ich habe mich wohl etwas unglücklich ausgedrückt.

Welche Events des IdSimpleServers werden ausgelöst, wenn ich folgende Tätigkeiten mit dem Client ausführe:


1. IdTCPClient.Connect
2. IdTCPClient.WriteLn
3. IdTCPClient.WriteFile
4. IdTCPClient.Disconnect


In allen 4 Fällen reagieren leider weder:
IdSimpleServer.OnStatus
IdSimpleServer.OnWork
IdSimpleServer.OnWorkBegin
IdSimpleServer.OnWorkEnd
IdSimpleServer.OnDisconnect

(und das sind alle Events des SimpleServers)

Ich habe also keine Möglichkeit auf irgendeine Aktion des IdTCPCLients zu reagieren...

Dax 2. Sep 2004 17:00

Re: IdSimpleServer: Wie Daten senden?
 
Doch: bei OnStatus checkst du, ob ein Kommando (wie das von mir) vorliegt, um es entsprechend zu verarbeiten.

DevilsCamp 2. Sep 2004 17:04

Re: IdSimpleServer: Wie Daten senden?
 
ich habe folgendes beim OnStatus-Event stehen:
Delphi-Quellcode:
procedure TForm1.IdSimpleServer1Status(ASender: TObject;
  const AStatus: TIdStatus; const AStatusText: String);
var
   i  : Integer;
begin
   i  := 0;
end;
und bei i:=0 einen Breakpunkt (Optimierung des Kompiliers ist ausgeschaltet).
Doch leider bleibt das Programm nicht stehen, wenn ich mit einem CLient connecte....
Und das sollte es doch eigentlich, wenn das OnStatus-Event ausgelöst wird, oder?

Dax 2. Sep 2004 17:11

Re: IdSimpleServer: Wie Daten senden?
 
Du kannst stattdessen schreiben:
Delphi-Quellcode:
i := Length(AStatusMessage);
height := height - i;
Dann würde das gehen.

DevilsCamp 3. Sep 2004 07:15

Re: IdSimpleServer: Wie Daten senden?
 
Zitat:

Zitat von Dax
Du kannst stattdessen schreiben:
Delphi-Quellcode:
i := Length(AStatusMessage);
height := height - i;
Dann würde das gehen.

:( :( :(

Leider auch nicht.
Es sieht wohl so aus, als ob OnStatus von der Komponente nicht ausgelöst wird (ich benutzte Indy 9.0.14)

SirThornberry 3. Sep 2004 07:49

Re: IdSimpleServer: Wie Daten senden?
 
Schau mal ob es ein OnExecute gibt.

DevilsCamp 3. Sep 2004 08:11

Re: IdSimpleServer: Wie Daten senden?
 
Es gibt:

OnDisconnect
OnStatus
OnWork
OnWorkBegin
OnWorkEnd


Aber irgendwie reagiert der auf keinen der 5 Events...

Des Weiteren gibt es in der Event-Liste noch (in Rot geschrieben):
Intercept
IOHandler

Folgendes steht in der Indy-Hilfe über Intercept:
Zitat:

Allows intercept of read and write operations for the connection.

property Intercept: TIdConnectionIntercept;

Description

Intercept is a TIdConnectionIntercept property used to act as an intermediary between the protocol stack and a TIdTCPConnection. Intercept is used to perform operations that can include logging send and receive operations, or provide Secure Socket Layer (SSL) support for the connection.
The Intercept must be Enabled to allow Intercept actions to be performed.

Über IOHandler steht folgendes:
Zitat:

Provides an abstract input/output source for send and receive operations.

property IOHandler: TIdIOHandler;

Description

IOHandler is a TIdIOHandler property that indicates the class to be used to provide input and output sources for the connection. IOHandler, and descendant classes, allow abstraction of send and receive operations using Socket connections, streams, or any input/output source where an IOHandler has been written. The default IOHandler in Indy is the socket-based TIdIOHandlerSocket.

IOHandler is used in methods that perform low-level read or write operations like ReadFromStack and WriteBuffer. IOHandler is also used in methods that access the connection status like CheckForDisconnect, Connected, DisconnectSocket, and Disconnect.

When accessing IOHandler in application code, always cast the IOHandler to the correct descendant class. This is needed to access any methods or properties in the descendant that cannot be represented in the ancestor class at runtime.

Vielleicht hilft das weiter (mir irgendwie nicht, obwohl ich doch recht gut Englisch verstehe...)

Dax 3. Sep 2004 13:56

Re: IdSimpleServer: Wie Daten senden?
 
Vielleicht liegt hier der Fehler:

Delphi-Quellcode:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
   if CheckBox1.Checked then
      IdSimpleServer1.Listen
   else
      IdSimpleServer1.EndListen;
end;
Versuch mal statt .Listen .BeginListen.

DevilsCamp 6. Sep 2004 11:48

Re: IdSimpleServer: Wie Daten senden?
 
hat erstens nicht funktioniert und zweitens bin ich nun auf IdTCPServer mit MaxConnections=1 umgestiegen.

quirks 6. Sep 2004 12:19

Re: IdSimpleServer: Wie Daten senden?
 
Bin grad in der Schule und deshalb ohne Indy, versuche aber trotzdem mal zu helfen.

Ich hab das immer so gemacht: Bei den Eigenschaften/Ereignissen des Servers gibt es ein OnExecute (oder ähnlich), das wird aufgerufen, wenn 1.) keine CommandHandler vorhanden sind oder 2.) CommandHandler deaktiviert werden. Im Normalzustand, also wenn du die Kompo gerade erst platziert hast, einfach eine Routine für On Exec. schreiben und fertig (einfacher gehts aber mit CommandHandlern)

DevilsCamp 6. Sep 2004 15:40

Re: IdSimpleServer: Wie Daten senden?
 
Auf die Idee wäre ich auch gekommen, wenn TIdSimpleServer ein OnExecute Event hätte ;)
Gibt es aber nicht.

Ich habe es jetzt aber auch geschafft die TIdTCPServer Komponente funktionierend in mein Programm einzubauen (bisher ist beim Versand von Dateien der Server einfach eingefroren, trotz TIdAntiFreeze)...

quirks 6. Sep 2004 16:20

Re: IdSimpleServer: Wie Daten senden?
 
OK, bin jetzt zu Hause und kann "interaktiv" Hilfe leisten :)

Hab meinen Fehler gefunden. :oops: Hast recht, IdSimpleServer hat kein OnExecute etc. :pale:

Hab an IdTCPServer (bzw. IdUDPServer) gedacht. Der ist zwar ein bisschen größer im Quälcode, ist aber SEHR viel einfacher zu handhaben. Mit OnConnect oder OnExecute oder ein paar CommandHandlern wird das bestimmt gehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz