Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 02, 2025 12:11

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 34 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 29, 2003 21:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Huhu,

also ich komme mit diesen Indy Komponenten einfach absolut nich klar... :(

ich habe in meinem Projekt einen Server und ~10 Clienten.

Nun soll der Client eine anfrage an den Server schicken, und der schickt die antwort(en) zurück...
Soweit kein problem, bisher hab ich das mit WinSock gemacht, ging auch ganz ok, nur das dabei immermal daten verloren gingen wenn viele anfragen gleichzeitig waren... :(

Deswegen wollte ich nun auf Indy umsteigen, hab aber absolut ganz und garkeine ahnung wie das da geht... die Demos sagen mir rein garnix und Tutorials finde ich auch keine gute :(

Kann mir mal wer erklären wie ich sowas wie oben beschrieben mit IndyKompos mache???
Also was muß ich da einstellen etc, welche Events blabla.. :)

Au'revoir,
Aya~

PS: Mit dem WinSock hab ich's so gemacht das das ServerProg/Client beide sowohl einen Client als auch Server drin hatten...

ClientProg-Client schickt an den ServerProg-Server "Hallo ich bin da" ->
ServerProg-Server sagt dem ServerProg-Client "Antworte dem mal".. und ServerProg-Client schickt an den ClientProg-Server "Willkommen :)"...

So in der art, wie mach ich das mit Indy??? :unsure:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 30, 2003 12:32 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Quelle ist von Delphisource.de, hatg mir sehr geholfen, als ich da Eingestiegen bin:
<a href='http://www.tutorials.delphi-source.de/indy/file002.shtml' target='_blank'>Delphi-source.de</a>

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 30, 2003 12:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Auf der Seite war ich schon, hat mir nix geholfen... :(

Du kennst dich doch mit den Indy Kompos aus, kannst du mir nich einfach mal kurz erklären wie ich da was machen muß etc??? *schaut lieb*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 30, 2003 13:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
PS: Bitte!! Ist sehr wichtig... muß das Programm bis Mittwoch fertig haben, und solange das mit dem Netzwerk nich fehlerfrei geht kann ich am rest schlecht weitermachen... :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 30, 2003 16:10 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Wie ist doch wirklich alles gut erklärt dort! Du gibst dem Client host und port, connectest und kannst dann überr die Verbindung mit Readln Nachrichten abrufen. Der Server selst arbeitet im Executre und liefert die Nachricht, die für den client bestimmt ist (das muss man ja selbst verwalten). Habe den Code von delphi-source.de fast 1:1 hochgeladen:
<a href='http://www.phobeus.de/temp/indytcp.zip' target='_blank'>tcp indy</a>

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 30, 2003 20:34 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
hi,

das wie du es in deinem Beispiel gemacht hast, hatte ich ja auch kapiert...

Aber bei dir sagt der client nur "ich bin da"... aber ich brauche das so das der Client sage "Gib mir die und die Daten" und der Server muß je nachdem was der Client sagt etwas anderes schicken...

Wie mach ich das???

Weil im Client nen WriteLN(Bla) und direkt dannach nen ReadLN machen geht ja net... oder?

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 30, 2003 20:49 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Nun setze doch mal deine Fantasy in Gang ;D Ich werde das ganze einfach mal sehr bildlich erzählen, glaube wenn Du nun noch wissen über Flags und Strukturen hast, wirst Du selbst schnell ne Lösung finden ;D

Client a sagt "Ich will wissen, wer da ist!"
Server erkennt, dass a nicht in List ist, setzt a in Liste und antwortet mit List.
Client a sagt "empfangen".
Server sagt "k, verdrück dich"
Client b sagt "Ich will, wissen, wer da ist!"
Server b erkennt, dass b bereits vor 10 Sekunden gefragt hat und banned b.

Speichere am besten die IP um die Rechner zu identifizieren. Je nachdem was, für eine Anfrage kommt, wird was anderes gesendet. Notfalls könntest auch client und server in einer app packen, so dass sie nur die IP ansteuern und jeweils auf die Anfrage die Antwort senden. Macht ne Sinn, wenn Du Applikations haben willst, die eigenständig asrbeiten sollen und keinen zentralen Server verwenden sollen.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2003 10:27 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Hi Aya,

ich verwende Indy in einem Replikationsprotokoll für eine Datenbank. Was mich an Indy am Anfang verwundert hat, ist, das der Requests der Clients in einem Thread -Kontext ablaufen. Damit hast Du natürlich die Probleme, die mit einem Thread zusammenhängen.

Eine Server - Komponente aufs Formular. In der OnExecute - Property ein Doppelklick, schon hast Du deine Methode, die ein(!) Request abarbeitet. Diese Methode entspricht einer Thread.Execute - Methode, also direkte Aufrufe mit der VCL sind problematisch und globale Listen immer mit TThreadList. Diese Requests können parallel ausgeführt werden.

In dieser Methode gehst Du linear vor. AThread.Connection enthält den Verbindungsdaten zu deinem Client.

Mit AThread.Connection.ReadLn(EOL, MaxTimeout) liest Du Daten von deinem Client, mit AThread.Connection.WriteLn schreibst Du die Antwort an deinen Client, mit AThread.Connection.Disconnect schliest der Server die Verbindung.

1. Befehl vom Client auslesen
2. Analysieren
3. Ergebnis an Client senden
4. Warten auf Bestätigung
5. Entweder weiter mit 1 oder Verbindung beenden.

Ich hoffe ich konnte Dir weiter helfen,

Gruß
KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2003 11:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ihr versteht mich glaub ich alle falsch :(

Mein Problem is nich wie ich am Server die daten vom Client speicher, oder wie ich nen Event mache etc.. *g*

Sondern mein Problem ist ganz simpel und einfach das ich keine ahnung von den IndyBefehlen habe.

Also...
Client sagt zum Server "Gib mir mal die liste der User"
Server schickt ihm die liste der User

mein ganz und gar aller einzigstes Problem an der sache ist nun.. äh.. ich sag's anders *g*
Erstmal macht der Client

Code:
  1. WriteLN("Los, gib mal Userliste")


..ja??
Dann im OnExecute vom Server:

Code:
  1. procedure OnExecute...;
  2. begin
  3.  &nbsp;msg:=AThread....ReadLN;
  4.  &nbsp;if msg = "Los gib mal userliste" then
  5.  &nbsp; &nbsp;WriteLN(UserListe);
  6. end;


so, ja??
Soweit sogut...

jetzt fehlt mir im Client aber noch ein ReadLN.. wo muß das hin?!

Denn direkt nach dem WriteLN bringt es doch nix, denn da kann es ja sein das dank langsamen Netzwerkes der Server nochnichmal den Request bekommen hat... oder??

Mein Problem is also nur, wo pack ich das ReadLN vom Client hin?

Danke ;)

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2003 12:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
huhu nochma.

ok... hab was rausgefunden *g*

Client.ReadLNWait...

aaaaaber... wenn jetzt im OnExecute vom Server mehrere Zeilen geschrieben wurden (also z.B. 3x WriteLN) bekomme ich so nur die letzte raus... was mach ich da?

Au'revoir,
Aya~

PS: Ist es 100%ig sicher das das was ich im OnExecute mit WriteLN mache, wirklich nur der Client bekommt der den Request gemacht hat, oder muß ich da nochwas beachten?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2003 13:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Aya hat geschrieben:
Denn direkt nach dem WriteLN bringt es doch nix, denn da kann es ja sein das dank langsamen Netzwerkes der Server nochnichmal den Request bekommen hat... oder??

Klar. Warum sollte das denn nicht gehen?

Hier mal ein kleines Sample (innerhalb von 5 Minuten erstellt und 100% funktionsfähig)
Code:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.  &nbsp;IdTCPClient1.Connect;
  4. end;
  5.  
  6. procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
  7. var
  8.  &nbsp;Int1, Int2: Integer;
  9. begin
  10.  &nbsp;Int1 := AThread.Connection.ReadInteger;
  11.  &nbsp;Int2 := AThread.Connection.ReadInteger;
  12.  &nbsp;AThread.Connection.WriteInteger(Int1 + Int2);
  13.  &nbsp;AThread.Connection.Disconnect;
  14. end;
  15.  
  16. procedure TForm1.IdTCPClient1Connected(Sender: TObject);
  17. var
  18.  &nbsp;TempInt: Integer;
  19. begin
  20.  &nbsp;IdTCPClient1.WriteInteger(10);
  21.  &nbsp;IdTCPClient1.WriteInteger(4);
  22.  &nbsp;TempInt := IdTCPClient1.ReadInteger;
  23.  &nbsp;ShowMessage('10 + 4 = ' + IntToStr(TempInt));
  24.  &nbsp;IdTCPClient1.Disconnect;
  25. end;


PS: Es wird für jede Verbindung ein eigener Thread abgespalten und diese besitzt eine eigene connection. Alles was du an Connection.Write sendest bekommt auch nur ein Client. Das geht vom Netzwerkprotokoll schon gar nicht anders. (wenn ich mich nicht irre)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2003 13:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

klar.. wenn ich 2x ReadLN aufrufe les ich auch beide Zeilen... aber anders geht das nich???

Bei mir isses so das es mal nur 1 Zeile sein kann, mal 20.... (ok, ich könnte jedesmal als erste Message einfach nen Count schicken, also wieviele Zeilen noch kommen, aber erstmal fragen ob's was besseres gibt *g*)

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2003 13:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Nö. Du wirst um diesen Count kaum drum herum kommen. Du könntest natürlich lesen so lange wie etwas kommt uns sobald du einmal einen Timeout bekommen hast dann gibt es nichts mehr. Aber das wäre äußerst ineffizient!
Nach Möglichkeit solltest du sogar die einzelnen Zeilen Binär codieren. Je nachdem wie häufig du sie sendest und wie komplex das ist was sich dort drin befindet. Einen einzelnen Namen bräuchte man nicht groß in Binär umwandeln. Aber wenn das eine komplexe Struktur ist sollte man das noch einmal überdenken.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2003 13:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
ach ja.. und nochwas *g*

Client.Connect; ... wenn der Server nich erreichbar is gibt es da ne AutoFehlermeldung.. kann ich die irgendwie unterdrücken???


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2003 14:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das ist keine Autofehlermeldung das nennt sich Exception und ist eine Wunderwaffe. :P
Wird von vielen C++lern nicht verwendet weil es "zu umständlich sei"!

Nicht abgefangene Exceptions werden spätestens von der Application abgefangen. Bei Quellen die Fehler produzieren können (wie "kein Server vorhanden") sollte man das try ... except bzw. try ... finally einsetzen.
Try ... except wird nur augerufen wenn ein Fehler aufgetreten ist.
Try ... finally wird immer aufgerufen sogar wenn ein Fehler aufgetreten ist. Wird eingesetzt um Resourcen wieder frei zu geben.
Code:
  1.  
  2. uses
  3.  &nbsp;... IdException;
  4.  
  5. procedure TForm1.Button1Click(Sender: TObject);
  6. begin
  7.  &nbsp;try
  8.  &nbsp; &nbsp;IdTCPClient1.Connect;
  9.  &nbsp;except
  10.  &nbsp; &nbsp;on E: EIdSocketError do begin
  11.  &nbsp; &nbsp; &nbsp;ShowMessage('Mir scheit als gäbe es keinen Server ...');
  12.  &nbsp; &nbsp;end;
  13.  &nbsp; &nbsp;on E: EIdAlreadyConnected do begin
  14.  &nbsp; &nbsp; &nbsp;ShowMessage('Döspadel du bist doch schon eingelockt!');
  15.  &nbsp; &nbsp;end;
  16.  &nbsp;end;
  17. end;
  18.  

So kannst du abfangen welcher Fehler aufgetreten ist. Du kannst den Exceptblock noch mit beliebigen Exceptions und Aktionen erweitern.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 34 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]