Autor Beitrag
alexschultze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: Sa 26.10.02 11:29 
??????
Hagbard Celine
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: Sa 26.10.02 14:22 
ok, das hab ich kapiert ;) klingt gut ;)

und wie wird das realisiert?
O'rallY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Sa 26.10.02 15:34 
Hagbard Celine hat folgendes geschrieben:
Bin aber auch kein Meister in Sockets!

Das stimmt wohl! :twisted: :wink:
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:
ausblenden 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" (:wink:) Weg über eine Stringlist sein.

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
alexschultze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: 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 :wink: ).
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: Mi 30.10.02 14:16 
sorry, kenn ich nicht.

ich komm aus le.. le.. leipzig ;)