| Autor |
Beitrag |
alexschultze
      
Beiträge: 317
|
Verfasst: Fr 25.10.02 17:04
hiho
ich hab gleich noch ne Frage
also: ich habe vor ein komplexes Programm zu schreiben.
Darin kommt vor, das ein CLient mit einem Host kommunizieren soll. (über Internet). Es werden hauptsächlich Strings und Integer gesendet.
Was für eine Komponente (für Komponenten) sollte ich nehmen? Was ist am Besten?
Ich dachte so an UDP oder TCPIP.
Es handelt sich um keinen Egoshooter, welcher unbedingt UDP benötigt, aber die Pakete sollten nicht ewig unterwegs sein, und mit möglichst großer Sicherheit (korrekt) ankommen.
Ein Mix aus UDP und TCP/IP ?
Oder was ganz anderes?
Warte gespannt auf eure Vorschläge, Alex 
|
|
Hagbard Celine
      
Beiträge: 119
|
Verfasst: Fr 25.10.02 17:17
Schau Dir doch als erstes mal die ganzen Diskussionen über Chat programmierung an! Da sollten doch all deine Fragen beantwortet werden. Da Du nur Strings hin und her jagen möchtest ist das ja auch nur eine Form eines Chats!
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Fr 25.10.02 21:35
und Integer?
Es wäre super wenn ich eine Art Record durchschleifen könnte!!!!!!
irgendein einzelner String, oder auch schon Stringliste wäre nur umständlich .. :/
(dauert lange bis mir 'record' einfällt *g*)
Strings und Integer gemixt!
alex
|
|
Hagbard Celine
      
Beiträge: 119
|
Verfasst: Sa 26.10.02 10:38
| alexschultze hat folgendes geschrieben: | und Integer?
Es wäre super wenn ich eine Art Record durchschleifen könnte!!!!!!
irgendein einzelner String, oder auch schon Stringliste wäre nur umständlich .. :/
|
Wäre mir neu! Bin aber auch kein Meister in Sockets! Aber soviel mir bekannt ist kommst Du nicht darum herrum! Stringlists sind aber sehr praktisch! Da kannst Du beliebig viele Werte in einem Zug übertragen! Ich erzeuge mir grundsätzlich eigene Objekte und übertrage deren Daten per XML! Ist sehr praktisch!
Da kannst Du wirklich alle Datenstrukturen abbilden!
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Sa 26.10.02 11:29
|
|
Hagbard Celine
      
Beiträge: 119
|
Verfasst: Sa 26.10.02 11:42
| alexschultze hat folgendes geschrieben: | | ?????? |
Ein Record ist eine Datenstruktur!
Sockets schicken aber nur Zeichenketten!
Du musst also deine Datenstruktur in eine Zeichenkette formatieren!
XML ist eine Möglichkeit Datenstrukturen abzubilden!
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Sa 26.10.02 14:22
ok, das hab ich kapiert  klingt gut
und wie wird das realisiert?
|
|
O'rallY
      
Beiträge: 563
|
Verfasst: Sa 26.10.02 15:34
| Hagbard Celine hat folgendes geschrieben: | Bin aber auch kein Meister in Sockets!
|
Das stimmt wohl!
| Hagbard Celine hat folgendes geschrieben: |
Sockets schicken aber nur Zeichenketten! |
..., denn Sockets verschicken sehr wohl auch Records, und zwar mittels SendBuf und ReceiveBuf! Ein Beispiel zur Veranschaulichung:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| {der Record} type TMyRecord = record s1, s2: string; i1, i2, i3: integer; end;
... var MyRecord: TMyRecord; ...
{zum senden:} //Daten des Records "MyRecord" werden verschickt Socket.SendBuf(MyRecord, SizeOf(TMyRecord)); {auf das T achten, da es sich hierbei um den Datentyp handelt}
{zum empfangen} //empfangene Daten werden in "MyRecord" gespeichert Socket.ReceiveBuf(MyRecord, SizeOf(TMyRecord)); |
Es muss also nicht der "unkonservative" (  ) Weg über eine Stringlist sein.
_________________ .oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Sa 26.10.02 16:16
prima! prima!
Welche Komponente soll ich also genau nehmen?
TSocketServer / Client ? (ist das INDY?)
kann ich da noch ein String 'davor' schreiben?
Das also vor dem Buffer mit dem Record immer noch ein String kommt?
Es werden mehrere User eingeloggt sein, und ich glaub es wäre am besten wenn immer bei jedem paket der Benutzername 'vorn' steht.
alex
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: So 27.10.02 10:24
also, ich hab mich jetzt mal reingearbeitet, in ServerSocket und CLientSocket.
Sehr praktisch.
Man kann Streams, Buffer und Lines (Strings) versenden.
Aber: wie kann man die beim empfangen unterscheiden?
P.s: Wie sieht es mit der Verteilung der Sockets aus? Wird immer hochgezählt? Wenn z.b. 1-2-3 einloggen und 1 ausloggt, würde der 4.te der einloggt auf socket 1 oder 4 landen?
alex
|
|
O'rallY
      
Beiträge: 563
|
Verfasst: So 27.10.02 10:34
| Zitat: | | Aber: wie kann man die beim empfangen unterscheiden? |
Das ist eine schon oft gestellte Frage im Forum, doch hat bisher noch keiner bestätigen könne, das dies geht. Man kann dem Problem aber durch einen Umweg begegnen, indem man vor dem Senden von Records eine String sendet, um anzukündigen, was jetzt gleich kommt. (so in der Art 'ich bin ein Record, und ich komm jetzt').
_________________ .oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
Zuletzt bearbeitet von O'rallY am So 27.10.02 13:37, insgesamt 1-mal bearbeitet
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: So 27.10.02 11:29
okay, da muss ich aber noch ein bisschen mehr über die sockets und deren Verteilung erfahen!
Wie ist das mit den Socket? (1-2-3-4 wie oben)
|
|
O'rallY
      
Beiträge: 563
|
Verfasst: So 27.10.02 13:39
Das weiß ich ehrlich gesagt nicht so genau, doch ich vermute, das wenn sich einer ausloggt, die anderen Connections nachrücken. Wenn sich also 1 ausloggtt ist 2 dann 1, 3 dann 2, usw.
Demnach würde der 4. der sich einloggt wieder auf dem letzten Platz landen.
_________________ .oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: So 27.10.02 14:54
Also, rausgefunden:
Sobald bei 1-2-3-4 der User 1 rausgeht, 'rutschen' alle nach.
2 wird 1, 3 wird 2, 4 wird 3 etc.
Zuletzt bearbeitet von alexschultze am Di 29.10.02 19:39, insgesamt 1-mal bearbeitet
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Di 29.10.02 19:35
wie kann ich ein Paket direkt an einen User (von mehreren) verbundenen senden?
Kann sein das connections[0] als 'Alle Connections' gilt?
alex
|
|
Hagbard Celine
      
Beiträge: 119
|
Verfasst: Di 29.10.02 20:01
| alexschultze hat folgendes geschrieben: | wie kann ich ein Paket direkt an einen User (von mehreren) verbundenen senden?
Kann sein das connections[0] als 'Alle Connections' gilt?
alex |
Die Indizes beginnen wie bei den meisten (fast allen) Arrays mit 0, das ist also kein verweis auf alle Clients! Um die User zu unterscheiden verwende ich den Zeiger Data des Socket Objekts. Da hänge ich einfach ein Objekt ran in welchem ich alle Identifikationsmerkmale speichere!
Um also an einen bestimmten Client zu senden brauchst Du nur den Index des Clients und los gehts!
|
|
Hagbard Celine
      
Beiträge: 119
|
Verfasst: Di 29.10.02 20:04
| O'rallY hat folgendes geschrieben: | | ..., denn Sockets verschicken sehr wohl auch Records, und zwar mittels SendBuf und ReceiveBuf! |
Geht das auch mit Objekten????
Wenn ja, welche vorraussetzung muss gegeben sein?????
Wie verarbeite ich das auf der anderen Seite????
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Di 29.10.02 21:13
ich hab hier noch nicht den Durchblick:
Wie kann ich mithilfe des Sockets den User eindeutig indentifizieren?!?
|
|
O'rallY
      
Beiträge: 563
|
Verfasst: Di 29.10.02 21:38
| Hagbard Celine hat folgendes geschrieben: | | Geht das auch mit Objekten???? |
Ich hab's ehrlich gesagt noch nicht ausprobiert, behaupte aber einfach mal, das sich dies genau wie mit Records verhält (logischerweise werden die Methoden wohl nicht mitgeschickt, doch wie es sich mit den Methoden genau verhält weiß ich nicht, musst du halt mal ausprobierten). Lasse mich aber gern eines besseren belehren...
| alexschultze hat folgendes geschrieben: | | Wie kann ich mithilfe des Sockets den User eindeutig indentifizieren?!? |
Wie meinst du das?
Wenn beim Server z.B. das OnClientRead-Event ausgeführt wird, kann man, wenn man einfach nur Socket. {...} schreibt, ohne Connections, auf die aktuelle Verbindung zugreifen (das kannst du z.B. mal so testen, dass du jedesmal die Socket.RemoteAddress ausgibst  ).
Um aber auf einen, zwar verbundenen, aber nicht aktiven Client zu zugreifen, benutzt man die Eigentschaft Socket.Connections[n].
Ich hoffe du hasts jetzt verstanden, ansonsten, frag einfach nochmal nach.
P.S.: Du kennst nicht zufälligerweise einen Alexander Schultze aus Lennestadt? (Wenn dir der Ort nix sagt, auch gut, würde meine Frage beantworten *g* )
_________________ .oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Mi 30.10.02 14:16
sorry, kenn ich nicht.
ich komm aus le.. le.. leipzig 
|
|