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
Tino: Ü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.
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
FrEaKY 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!