Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Listbox Inhalt von Server zum clienten schicken??? (https://www.delphipraxis.net/120495-listbox-inhalt-von-server-zum-clienten-schicken.html)

htxmlx 11. Sep 2008 15:02


Listbox Inhalt von Server zum clienten schicken???
 
Hallo,
ich hab eine kleine Frage die ich mir aus sämtlichen Chat-Turorials und der Sufu net beantworten konnte... unzwar hab ich aus einem Tutorial einen Chat programmiet, da mir dies noch ein wenig zu simpel war hab ich mir überlegt ne Online-Liste zu machen, in der man den Computernamen von dejenigen sieht die online sind, computernamen deshalb weils erstmal einfacher ist als der nickname...

so auf dem server erscheinen die namen der online user auch alle in der ListBox, nur meine Frage ist jetzt wie ich es hinbekomme das ich den Ihnalt der Listbox von server nun auch zur listbox beim clienten schicken kann, da ich den gesendeten text dann ja i-wie definieren müsste? Dafür müsste es doch einen befehl wie clientsend listbox.index... oder sowas geben?

Ich hoffe wenigestens einer versteht mien problem andererseits kann ich mienen quelltext auch nochmal posten....

Gruß, htxmlx

SirThornberry 11. Sep 2008 15:41

Re: Listbox Inhalt von Server zum clienten schicken???
 
Der Client sendet am besten eine Anfrage an den Server das er die Liste haben will und der Server antwortet entsprechend mit der Liste.
Natürlich kann der Server auch einfach so die Liste schicken ohne das vorher angefragt wurde was sinn macht sobald sich ein neuer Client anmeldet (der Server geht dann die Liste aller Clients durch und schickt diesen die Liste).
Um dir genau weiterhelfen zu können müsstest du uns verraten mit welchen Komponenten du es bisher, wie anstellst und an welcher Stelle du genau mit diesen Komponenten nicht weiter kommst.

htxmlx 11. Sep 2008 15:52

Re: Listbox Inhalt von Server zum clienten schicken???
 
Ok danke erstmal für deine Antwort, also bisher arbeite ich mit ClientSocket und ServerSocket, die beiden die man sich da erst wiederhohlen muss in den Reiter Internet...


So wird etwas zum Server verschickt...
Delphi-Quellcode:
if (ClientSocket1.Active=true) and (Edit1.Text<>'') then ClientSocket1.Socket.SendText(NickName+': '+Edit1.Text);
Edit1.Text:='';
Edit1.SetFocus;
Und so wird der Text der von Server gesendet wird im Clienten eingelesen..
Delphi-Quellcode:
Memo1.Lines.Add(Socket.ReceiveText);
So empfängt bzw. sendet der server den text...
Delphi-Quellcode:
 Text:=Socket.ReceiveText;
    Memo1.Lines.add(Timetostr(now)+': '+Text);
    For I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
    begin
     with ServerSocket1.Socket.Connections [I] do
     if (Connected) then SendText(Text);
      end;
Gruß, htxmlx

SirThornberry 11. Sep 2008 15:57

Re: Listbox Inhalt von Server zum clienten schicken???
 
dann in deiner Schleife den Inhalt der Listbox (List.Items.Text) versenden.

als kleiner Tipp für Später: Denke dir ein Protokoll aus sonst bekommst du irgendwann unschöne Fehler.
Denn wenn du kurz hintereinander 2 was sendest kann es passieren das dies als ein 1 gesamter Text ankommt.
Bei großen Daten kann es hingegen passieren das du 1 was sendest und es in mehreren Stücken hintereinander ankommt.

htxmlx 11. Sep 2008 16:02

Re: Listbox Inhalt von Server zum clienten schicken???
 
Also dann "Send(Listbox1.Items.Text)" oder wie lautet der genaue Befehl ?

Das mit dem Protokoll hab ich mir auch schon mal angeguckt aber...denke damit fang ich vielleicht in ein bis zwei monaten mal an..

Gruß, htxmlx

SirThornberry 11. Sep 2008 16:05

Re: Listbox Inhalt von Server zum clienten schicken???
 
probier es einfach aus ob es so geht. Wenn es nicht funktioniert einfach nochmal nachfragen :-) Man lernt am meisten wenn man einfach probiert und es sich dadurch selbst erarbeitet.

htxmlx 11. Sep 2008 16:39

Re: Listbox Inhalt von Server zum clienten schicken???
 
Ne funkt leider net...
aber ich bräuchte ja zwei befehle unzwar:

1. Wie sendet der Server den inhalt der Listbox
2. wie empfängt der client diesen inhalt...weil als ReciveText kann er den ja nicht empfangen, da der ja im Memo-Fenster (Chatfenster) angezeigt wird...

Gruß, htxmlx

PS: Man müsste praktisch definieren können welcher Text gesendet wird, einmal die Message für den Chat und einmal die Liste, die dann zum client gesendet wird und dort zu der listbox geaddet wird...

DeddyH 11. Sep 2008 17:22

Re: Listbox Inhalt von Server zum clienten schicken???
 
Mach das doch per SendText und setz ein Zeichen vornedran, das der Normalbenutzer wohl nie eingeben wird (#255 z.B.). Wenn der Text mit diesem Zeichen beginnt, kannst Du halbwegs sicher sein, dass das keine Benutzereingabe war.

htxmlx 11. Sep 2008 17:39

Re: Listbox Inhalt von Server zum clienten schicken???
 
Das wäre ne idee, aber wie kann ich die ersten 3 zeilen definieren, d.h.

if "der recievde text begin mit #255" then add to listbox...

Gruß, htxmlx

DeddyH 11. Sep 2008 17:57

Re: Listbox Inhalt von Server zum clienten schicken???
 
Was meinst Du mit "die ersten 3 Zeilen"?

htxmlx 11. Sep 2008 18:05

Re: Listbox Inhalt von Server zum clienten schicken???
 
sorry soll buchstaben heißen also diese vorbuchstaben wie z.b. #25 dann muss ich dem computer ja sagen das eine message mit den 3 vorbuchstaben ein nickname ist ...wie mach ich das dann?

Gruß, htxmlx

DeddyH 11. Sep 2008 18:15

Re: Listbox Inhalt von Server zum clienten schicken???
 
Also, Du willst als Merkmal 3 bestimmte Zeichen schicken? Würde ich mit Length() und Copy() abfragen.

htxmlx 11. Sep 2008 18:18

Re: Listbox Inhalt von Server zum clienten schicken???
 
ok, thx erxtmal nur da ich damit bis jetzt noch net gearbeitet habe wir würde das dann ausehen in der If Abfrage mit dem ReciveText der dann als Text definiert ist...


Gruß, htxmlx

DeddyH 11. Sep 2008 18:20

Re: Listbox Inhalt von Server zum clienten schicken???
 
Delphi-Quellcode:
s := Socket.ReceiveText;
if (Length(s) > 2) and (Copy(s,1,3) = '123') then...
So in der Art.

htxmlx 11. Sep 2008 18:24

Re: Listbox Inhalt von Server zum clienten schicken???
 
ah danke: perfekt genau das hab ich gesucht...ich probiere mich dann mal in der anwendung dessen und melde mich beim nächsten problem wieder...

Gruß, htxmlx

htxmlx 11. Sep 2008 19:04

Re: Listbox Inhalt von Server zum clienten schicken???
 
Ok in die Listbox bekommen tu ichs, nur das stehen dann immer noch die 3 vorzeichen vor dem namen kann man die mit irgendeinem befehlt wegmachen?

nach langem rumprobieren bin ich an einem zweiten problem verzweifelt wenn der client dann disconnected dann soll der nickname ja auch aus der online lite gelöscht werden ich habs so versucht...
Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
i: Integer;
Text: String;
begin
Text:=Socket.ReceiveText;
i := Clients.Items.IndexOfObject(Text);
if (Length(Text) > 2) and (Copy(Text,1,3) = '#99') then
Clients.Items.Delete(i);
end;
Also bei disconnecten sendet man noch einmal die nickname nachricht mit #99 davor und wenn die dann bei disconnecten halt ankommt soll das item halt gelöscht werden. mien problem nur man kann den index of object leider net von text definieren sondern nur von TObjecten, also wie soll ich da umsetzen...

Gruß, htxmlx

htxmlx 11. Sep 2008 19:59

Re: Listbox Inhalt von Server zum clienten schicken???
 
Also ich bin jetzt soweit das alles funktioniert außer das löschen der schon disconnecteten Nicknames und halt das Verstecken der 3 anfangs zeichen...

Gruß, htxmlx

SirThornberry 11. Sep 2008 21:02

Re: Listbox Inhalt von Server zum clienten schicken???
 
Könntest du bitte für das neue Problem auch ein neues Thema erstellen? Das hier rein zu packen führt nur zu einem Durcheinander. Zudem findet man es dann über die Suche nicht so gut weil der Titel gar nicht mehr dazu passt.

htxmlx 12. Sep 2008 14:15

Re: Listbox Inhalt von Server zum clienten schicken???
 
Naja meine Frage von oben besteht ja noch, denn ich muss ja wenn ein Client connectet den kompletten inhalt der listbox aufm server an ihn senden...auf dem server funktioniert alles nur der client bekommt bis jetzt nur ne person online angezeit wenn sie nach ihm kommt...

ich müsste also alle nicknames die auf server in der listbox stehen in einzenlnen nachrichten versenden
und das natürlich wenn jemand on kommtz.B.

Listbox aufm server

#99Marc
#99Hubert
#99Lisa

So jetzt muss zum Clienten

..SendText(ListboxItem1)
..SendText(ListboxItem2)
..SendText(ListboxItem3)
und das bis alle versendet sind..aber woher weiss das ding wieviele drin sind und wie mach ich das das für jedes ne einzelne nachricht kommt???

Gruß, htxmlx

DeddyH 12. Sep 2008 14:24

Re: Listbox Inhalt von Server zum clienten schicken???
 
Lauf doch einfach in einer Schleife durch die Listbox.Items und sende jeden Eintrag.

htxmlx 12. Sep 2008 14:26

Re: Listbox Inhalt von Server zum clienten schicken???
 
wie würde das dann als code aussehen ?

Gruß, htxmlx

DeddyH 12. Sep 2008 14:27

Re: Listbox Inhalt von Server zum clienten schicken???
 
Du weißt nicht, wie eine Schleife funktioniert? :shock:

htxmlx 12. Sep 2008 14:46

Re: Listbox Inhalt von Server zum clienten schicken???
 
doch mit while und repeat glaube ich oder?

htxmlx 12. Sep 2008 14:48

Re: Listbox Inhalt von Server zum clienten schicken???
 
mien prinzip ist bis jetzt so aufgebaut ist das wenn jemand joindet oder leavt wird beim server und allen clienten die listbox gelöscht, dann sendet jeder client eine message mit #99nickname die der server bei sich inner lsitbox aufnimmt und dann wieder an die clienten weiterleitet, die wiederum erkennen #99nickname als nickname und fügen ihn bei sich ein...das funktioniert auch reibunslos nur manchmal erscheinen dann 2 clienten nebeneinander in einer listboxzeile...??

Gruß, htxmlx

DeddyH 12. Sep 2008 15:00

Re: Listbox Inhalt von Server zum clienten schicken???
 
Nebeneinander oder untereinander?

htxmlx 12. Sep 2008 15:06

Re: Listbox Inhalt von Server zum clienten schicken???
 
untereinander will ich haben aber manchmal kommt es nebeneinander, ich glaube dashängt damit zusammen dsa ja alle clienten dann zum gleichen zeitpunkt die nachricht mit dem nickname absenden und der server somit dann bei 4 clients zum gleichen zeitpunkt 4 nachrichten bekommt....

Gruß, htxmlx

DeddyH 12. Sep 2008 15:08

Re: Listbox Inhalt von Server zum clienten schicken???
 
Die Vermutung hege ich auch. Evtl. wäre es besser, pro Client einen Thread zu starten.

htxmlx 12. Sep 2008 15:14

Re: Listbox Inhalt von Server zum clienten schicken???
 
hab ich schon was von gehört aber wie genau starte ich nen neuen thread?

Gruß, htxmlx

DeddyH 12. Sep 2008 15:16

Re: Listbox Inhalt von Server zum clienten schicken???
 
Schau mal in die Demos, da gibt es ein schönes Beispiel.

htxmlx 12. Sep 2008 15:18

Re: Listbox Inhalt von Server zum clienten schicken???
 
demos? meinst du tutorials? oder ist demos noch was anderes?

Gruß, htxmlx

DeddyH 12. Sep 2008 15:28

Re: Listbox Inhalt von Server zum clienten schicken???
 
In Deinem Delphi-Verzeichnis sollte es einen Ordner "Demos" geben. Da sind manche Schätzchen drin.

htxmlx 12. Sep 2008 15:29

Re: Listbox Inhalt von Server zum clienten schicken???
 
KK da guck ich mal nach...

Gruß, htxmlx

htxmlx 12. Sep 2008 16:49

Re: Listbox Inhalt von Server zum clienten schicken???
 
Habs gefunden und mir angesehen und versucht nachzuvollziehen, aber da dort keine Kommentare oder sonstiges stehen hab ichs i-wie net verstanden, könntest du so freundlich sein und mir in ein zwei sätzen nochmal erläutern was genau ein thread ist und was er bewirkt, also anwendungsweise...das wäre nett.

Gruß, htxmlx

DeddyH 12. Sep 2008 16:53

Re: Listbox Inhalt von Server zum clienten schicken???
 
Ein Thread ist eine Art "Kindprozess", den Du quasi vom Hauptprogramm abspalten kannst (z.B. das Drucken im Hintergrund, während der Hauptthread bereits weiterarbeitet).

htxmlx 12. Sep 2008 16:55

Re: Listbox Inhalt von Server zum clienten schicken???
 
ok thx, aber wie sollte ich das hier anwenden, also was würde das hier bringen um den nachrichten stau zu verhindern?

Gruß, htxmlx

DeddyH 12. Sep 2008 17:03

Re: Listbox Inhalt von Server zum clienten schicken???
 
Na gut, gehen wir mal weg von den Threads. Ich habe es nicht mehr im Kopf, aber konnte man bei den Socket-Komponenten nicht irgendwie die Gegenstelle abfragen? Dann wäre es doch recht einfach zu schauen, ob man von der Gegenstelle bereits einen Eintrag hat. Ansonsten poste doch mal den Code zum Bestücken der Listbox.

htxmlx 12. Sep 2008 17:24

Re: Listbox Inhalt von Server zum clienten schicken???
 
Ich poste einfach mal den Code also wenn ein user drauf geht oder runter geht passiert folgendes
Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
i: Integer;
Text: String;
begin
Clients.Items.Clear;
For I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
begin
with ServerSocket1.Socket.Connections [I] do
if (Connected) then SendText('#55');
end;
end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
  var test: Integer;
begin
Clients.Items.Clear;
For test := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
begin
with ServerSocket1.Socket.Connections [test] do
if (Connected) then SendText('#55');
end;
end;
Erläuterung, also wenn einer runter geht oder drauf geht dann wird die listbox(namens clients) gelöscht und an alle clienten die message '#55' gesendet.
Empfängt ein client diese message wird bei diesem ebenfalls die lsitbox gelöcht und eine message mit
'#99'+Nickname an den server gesendet...
der server empfängt '#99' und weiss das es sich um einen nickname handelt also füft er diesen bei sich in der listbox ein und sendet die nachricht mit '#99'+nickname an alle clienten..
alle clienten empfangen also die messages mit dem '#99' und fügen diese somit auch bei sich in die listbox ein

eigentich ganz simpel, es funktioniert ja auch alles bis auf das problem, dass alle clienten bei mir im test 4 zur gleichen zeit ihre '#99'nickname messages senden..

beim clienten sieht das dann so aus
Delphi-Quellcode:
procedure TForm1.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
var Text:string;
begin
Text:=Socket.ReceiveText;
Form1.Show;
if (Length(Text) > 2) and (Copy(Text,1,3) = '#77') then
Memo1.Lines.Add(Text);
if (Length(Text) > 2) and (Copy(Text,1,3) = '#99') then
Listbox1.AddItem(Text,Socket);
if (Length(Text) > 2) and (Copy(Text,1,3) = '#55') then
Listbox1.Items.Clear;
if (Length(Text) > 2) and (Copy(Text,1,3) = '#55') then
ClientSocket1.Socket.SendText('#99' + NickName);
end;
die codes: #77 - eine normale chat message
#99 - ein nickname
#55 - befehl zum online liste aktualisiern


ich hoffe du kannst dich da eindeken und verstehst das

Gruß, htxmlx

DeddyH 12. Sep 2008 17:40

Re: Listbox Inhalt von Server zum clienten schicken???
 
Wäre es nicht besser, sich eine Klasse zu erstellen, in der man sich die Remote-Adresse samt des entsprechenden Nicknamen merkt und diese in die Listbox einfügt? Wenn sich jemand abmeldet, kannst Du ihn dann eindeutig identifizieren und nur dessen Eintrag aus der Listbox löschen. Erscheint mir sinnvoller, als jedesmal die komplette Liste neu aufzubauen.

htxmlx 12. Sep 2008 17:51

Re: Listbox Inhalt von Server zum clienten schicken???
 
Hat aber einen Nachteil da man seine IP doch relativ einfach ändern kann...gibt es nicht ne lösung wie man das nachrichten senden der einzelnen clienten vielleicht untereinandern verzögern könnte?

Gruß, htxmlx

htxmlx 12. Sep 2008 18:42

Re: Listbox Inhalt von Server zum clienten schicken???
 
ich bräuchte theoretisch einen delay der zwischen dem empfangen der '#55' message und dem senden des nicknames steht...dieser müsste sich aber pro client um 100ms erhöhen oder so...? ginge sowas?

Gruß, htxmlx


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz