![]() |
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 |
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. |
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:
Und so wird der Text der von Server gesendet wird im Clienten eingelesen..
if (ClientSocket1.Active=true) and (Edit1.Text<>'') then ClientSocket1.Socket.SendText(NickName+': '+Edit1.Text);
Edit1.Text:=''; Edit1.SetFocus;
Delphi-Quellcode:
So empfängt bzw. sendet der server den text...
Memo1.Lines.Add(Socket.ReceiveText);
Delphi-Quellcode:
Gruß, htxmlx
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; |
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. |
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 |
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.
|
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... |
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.
|
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 |
Re: Listbox Inhalt von Server zum clienten schicken???
Was meinst Du mit "die ersten 3 Zeilen"?
|
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 |
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.
|
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 |
Re: Listbox Inhalt von Server zum clienten schicken???
Delphi-Quellcode:
So in der Art.
s := Socket.ReceiveText;
if (Length(s) > 2) and (Copy(s,1,3) = '123') then... |
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 |
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:
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...
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; Gruß, htxmlx |
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 |
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.
|
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 |
Re: Listbox Inhalt von Server zum clienten schicken???
Lauf doch einfach in einer Schleife durch die Listbox.Items und sende jeden Eintrag.
|
Re: Listbox Inhalt von Server zum clienten schicken???
wie würde das dann als code aussehen ?
Gruß, htxmlx |
Re: Listbox Inhalt von Server zum clienten schicken???
Du weißt nicht, wie eine Schleife funktioniert? :shock:
|
Re: Listbox Inhalt von Server zum clienten schicken???
doch mit while und repeat glaube ich oder?
|
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 |
Re: Listbox Inhalt von Server zum clienten schicken???
Nebeneinander oder untereinander?
|
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 |
Re: Listbox Inhalt von Server zum clienten schicken???
Die Vermutung hege ich auch. Evtl. wäre es besser, pro Client einen Thread zu starten.
|
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 |
Re: Listbox Inhalt von Server zum clienten schicken???
Schau mal in die Demos, da gibt es ein schönes Beispiel.
|
Re: Listbox Inhalt von Server zum clienten schicken???
demos? meinst du tutorials? oder ist demos noch was anderes?
Gruß, htxmlx |
Re: Listbox Inhalt von Server zum clienten schicken???
In Deinem Delphi-Verzeichnis sollte es einen Ordner "Demos" geben. Da sind manche Schätzchen drin.
|
Re: Listbox Inhalt von Server zum clienten schicken???
KK da guck ich mal nach...
Gruß, htxmlx |
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 |
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).
|
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 |
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.
|
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:
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.
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; 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:
die codes: #77 - eine normale chat message
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; #99 - ein nickname #55 - befehl zum online liste aktualisiern ich hoffe du kannst dich da eindeken und verstehst das Gruß, htxmlx |
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.
|
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 |
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 14:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz