Entwickler-Ecke

Internet / Netzwerk - Übertragungsrate TCPServer - TCPClient


FrEaKY - So 06.01.08 03:22
Titel: Übertragungsrate TCPServer - TCPClient
Es geht mir hierbei nicht um die Übertragungsrate selbst, sondern um die Prozeduren in denen man diese berechnen kann. Beim idTCPClient gibts ja dafür BeginWork und DoWork usw. Jedoch beim Server sind sie nurnoch als Funktionen vorhanden und nicht mehr im Objektfenster. Aber ich will die Geschwindigkeit ja beim Server wissen und nich beim Client.

Wie kann ich diese Funktionen irgendwie auf eigene Funktionen "umleiten", damit ich das dort ausrechnen kann?

Moderiert von user profile iconTino: Überflüssige Zeilenumbrüche entfernt.


FrEaKY - Di 08.01.08 11:06

weiß es keiner?


hazard999 - Di 08.01.08 12:16

Hallo,

eigene Klasse von TIDTcpServer ableiten.

Funktionen verdecken.

im Funktionscode dann inherited aufrufen

eigenen Code dazu implementieren.

Wenn dir das jetzt nichts sagt: OOP-Tutorial lesen.

r u

René


FrEaKY - Mi 09.01.08 11:01

Kannst du mir nen Link geben oder so? Hier in den Tutorials hab ichs net gefunden.


hazard999 - Mi 09.01.08 11:24

das sollte helfen:

http://www.delphi-library.de/viewtopic.php?t=22245&highlight=klassen

r u

René


FrEaKY - Do 10.01.08 08:01

Hm ich kriegs net so richtig hin, kannste vllt nen Beispiel posten?


FrEaKY - Mo 04.02.08 15:52

Wäre nett wenn jemand ne kleine Anleitung geben könnte.

Ich hhabs jetzt so aber es funzt nicht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  
ser = class(TIdTCPSErver)
  public
    [...] 
    procedure serWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
        const AWorkCountMax: Integer);
  end;

[...]

procedure ser.serWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
   inherited;
   showmessage('blah');
   form1.label3.caption := inttostr((aworkcountmax div 1024))+ ' K';
   form1.progressbar1.Max := aworkcountmax;
end;


Die Showmessage wird noch nichtmal aufgerufen...


MarkusD - Mo 04.02.08 16:45

Hallo,

ich weiß jetzt zwar nicht, wie die Methode beim TIDTcpServer heißt, aber du sollst keine eigene procedure erstellen, sondern die alte überschreiben.
Ich nehme jetzt einfach mal an, dass die Methode in Indy "WorkBegin" heißt. Dann müsstest du folgendes machen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
ser = class(TIdTCPSErver)
  public
    [...] 
    procedure WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
        const AWorkCountMax: Integer); override;
  end;


Markus


hazard999 - Mo 04.02.08 16:52

Exakt.

Markus war schneller ^_°


FrEaKY - Sa 16.02.08 18:35

Es funzt leider immernoch nicht. Ich komm einfach nich dahinter warum...
habs jetzt so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  ser = class(TIdTCPSErver)
  public
    procedure serConnect(AThread: TIdPeerThread);
    procedure serExecute(AThread: TIdPeerThread);
    procedure serDisconnect(AThread: TIdPeerThread);
    procedure BeginWork( AWorkMode: TWorkMode;
        const AWorkCountMax: Integer); override;
  end;


procedure ser.BeginWork( AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
   inherited;
   showmessage('asf');
   form1.label3.caption := inttostr((aworkcountmax div 1024))+ ' K';
   form1.progressbar1.Max := aworkcountmax;
end;


:cry:


FrEaKY - Mi 05.03.08 18:47

PLEASE HELP!! :cry: :cry: :cry:


artelogic - Fr 07.03.08 02:10

das funzt nicht, weil das so nicht geht. die sache ist im server etwas verstrickter. das geht damit los, daß der multi-threaded ist und endet nicht damit, daß der einen anderen iosockethandler verwendet.

was soll das denn überhaupt werden? also warum willst du am server messen? oder um es mal genau unter die lupe zu nehmen, kannst du ja gar nicht an nur einem punkt messen. der server haut die daten ggf. in wenigen millisekunden raus, wann die aber komplett an der gegenstelle eingetroffen sind, läßt sich ja server-seitig ohne weiteres überhaupt nicht feststellen.


Quitzlinga - Fr 07.03.08 11:20

Es sei denn, man verlangt vom Client eine Antwort, das die Daten eingetroffen sind, womit man wieder bei der Implementierung eines Protokolls ist.


FrEaKY - Do 13.03.08 10:08

Nene, also zu erfahren wann die Daten angekommen sind darum gehts mir garnicht.
Sondern ich will in der DoWork procedure die GEschwindigkeit messen. Aber wenn ich die so mache wie im Beispiel wird sie ja nichmal aufgerufen... :/
Das muss doch irgendwie gehen :S


artelogic - Fr 14.03.08 20:33

Wie sieht denn der Write aus? Bisschen Source bitte!


FrEaKY - Fr 14.03.08 20:45

Senden (beim client):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button3Click(Sender: TObject);
var
    fs : tfilestream;
begin
    fs := Tfilestream.Create('lmao.mp3', fmOpenRead or fmShareDenyWrite);
    try
        cli.Connect(10);
        cli.OpenWriteBuffer(fs.Size);
        cli.WriteStream(fs, true, false, fs.Size);
        cli.ClearWriteBuffer;
        cli.CloseWriteBuffer;
        cli.Disconnect;
    finally
        fs.Free;
    end;
end;



Empfangen (beim server):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure ser.serExecute(AThread: TIdPeerThread);
var
    ts : tfilestream;
begin
    ts := Tfilestream.Create('lmao2transferred.mp3', fmCreate);
    athread.Connection.RecvBufferSize := 32768;
    try
        athread.Connection.OpenWriteBuffer(ts.Size);
        athread.Connection.ReadStream(ts,-1, true);
        athread.Connection.ClearWriteBuffer;
        athread.Connection.CloseWriteBuffer;
    finally
        ts.Free;
    end;
end;



Naja und für die Fortschrittsanzeige

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure ser.serWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
    inherited;
    form1.progressbar1.Position := aworkcount;
end;


procedure ser.BeginWork( AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
   inherited;
   showmessage('lol');
   form1.label3.caption := inttostr((aworkcountmax div 1024))+ ' K';
   form1.progressbar1.Max := aworkcountmax;
end;

<- Der teil geht halt nicht, also wird nicht aufgerufen... Warum!! Was ist da falsch=?


artelogic - Fr 14.03.08 21:06

kurze zwischenfrage: welche indy version? wenn 10, dann bitte genau. wenn 9, bin ich eh raus... ;)


FrEaKY - Fr 14.03.08 21:15

keine Ahnung ehrlich gesagt :?

ich hab die ganz normalen die bei Delphi 7 Enterprise dabei waren.


artelogic - Fr 14.03.08 21:29

na gut, sei es mal drum. ;)

das läuft ja wahrscheinlich beides (server und client) auf einem computer, wenn nicht sogar in einem project. kannste das mal andersrum machen, also server schreibt und client ließt?


FrEaKY - Fr 14.03.08 21:36

hmmm andersrum hatte ich es schon vorher :P aber hab dann aus einigen gründen geändert, u.a weil es so für mich einfacher ist vom server aus die übertragungen entgegenzunehmen.

Aber es ging ja als ichs genau anders rum hatte auch schon nicht also daran kann es nicht liegen!
:?


artelogic - Fr 14.03.08 22:04

user profile iconFrEaKY hat folgendes geschrieben:
Senden (beim client):
Naja und für die Fortschrittsanzeige

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure ser.serWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
    inherited;
    form1.progressbar1.Position := aworkcount;
end;


procedure ser.BeginWork( AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
   inherited;
   showmessage('lol');
   form1.label3.caption := inttostr((aworkcountmax div 1024))+ ' K';
   form1.progressbar1.Max := aworkcountmax;
end;

<- Der teil geht halt nicht, also wird nicht aufgerufen... Warum!! Was ist da falsch=?


das kannste auch tendenziell mal vergessen. ich hatte dir ja schon vor einiger zeit geantwortet, und das darin angedeutet. aber darauf wollteste ja nicht eingehen...
es geht eher in die richtung (und jetzt seh ich auch gerade, daß es sich um indy 9 handelt, aber mal egal):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure ser.serExecute(AThread: TIdPeerThread);
var
    ts : tfilestream;
begin
    ts := Tfilestream.Create('lmao2transferred.mp3', fmCreate);
    athread.Connection.RecvBufferSize := 32768;
    try
        athread.Connection.OnWorkBegin:=IrgendwasA;
        athread.Connection.OnWork:=IrgendwasB;
        athread.Connection.OnWorkEnd:=IrgendwasC;

        athread.Connection.OpenWriteBuffer(ts.Size);
        athread.Connection.ReadStream(ts,-1, true);
        athread.Connection.ClearWriteBuffer;
        athread.Connection.CloseWriteBuffer;
    finally
        ts.Free;
    end;
end;


IrgendwasA, -B, und -C müssen aber thread-safe sein, und wenn sie es nicht sind, synchronisiert aufgerufen werden. sonst crasht das hinundwieder oder auch immer. aber wenn das nur mal ein test deiner "übertragungsrate" sein soll, dann kannste das vielleicht in kauf nehmen. aber sauber ist es dann nicht... ;)

und ich befinde mich ein bisschen im blindflug, weil ich indy 9 weder habe noch kenne. das aber nur am rande.