Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Server disconnectet Client (https://www.delphipraxis.net/36718-server-disconnectet-client.html)

Muetze1 28. Dez 2004 14:28

Re: Server disconnectet Client
 
Moin!

Zitat:

Zitat von delphman
Aber beim Client-Programm schick ich ja auch im ClientConnect eine Nachricht zum Server.
Die soll ja dann halt im Server auch bei ClientConnect eben lesen.

Schicken kannst du Nachrichten wann du willst, Hauptsache der Socket existiert. Wenn du im OnClientConnect was sendest, dann kannst du es erst im OnClientRead auslesen - und dieses Event kommt immer nach dem OnClientConnect. Das du jetzt schon was im OnClientConnect auslesen kannst bei deinem Server liegt in der Tat daran das du es im lokalen LAN benutzt und es daher schnell ist. Der von dir gesendete String löst so oder so ein OnClientRead aus und daher ist es nicht gut im OnClientConnect des Servers zu versuchen den Text schon auszulesen.

Du musst dich von der Vorstellung trennen, beim Connect des Clients dessen NickName zu erfahren - das geht nur im nachhinein. Du musst dir in deinem Programm eine solche Struktur vorhalten, das du den Nicknamen er später erfährst - es geht nicht anders. In meinem oben verlinkten Chat wird das ganze zwar über Streams gelöst aber trotzdem wird dort der NickName auch erst später übermittelt. Trotzdem ist es noch schnell genug als das es nicht auffällt.

MfG
Muetze1

PierreB 28. Dez 2004 14:33

Re: Server disconnectet Client
 
Ok, du hast Recht ! :thumb:

Gibs nicht ne andere Möglichkeit den Nicknamen "einfach" mit in die ListBox zu bekommen, ohne eine extra Class zu erstellen ?

Wenn nicht dann lass ich dieses Feature halt weg ! ;)

Muetze1 28. Dez 2004 14:40

Re: Server disconnectet Client
 
Moin!

Zitat:

Zitat von delphman
Ok, du hast Recht ! :thumb:

Gibs nicht ne andere Möglichkeit den Nicknamen "einfach" mit in die ListBox zu bekommen, ohne eine extra Class zu erstellen ?

Wenn nicht dann lass ich dieses Feature halt weg ! ;)

Klar, wenn du im OnClientRead den NickName empfängst...

... dann hast du nämlich folgendes:

1. in der Procedure hast du den Socket übergeben bekommen
2. du hast den nick ausgelesen aus dem mit ReceiveText empfangenen
3. du hast die ListBox wo hinten bei Items.Objects[] der Socket drinne steht der dir übergeben wurde
4. Wenn du den Eintrag in 3. gefunden hast, dann kannst du doch einfach seinen Text abändern.

MfG
Muetze1

PierreB 28. Dez 2004 14:46

Re: Server disconnectet Client
 
Zitat:

Klar, wenn du im OnClientRead den NickName empfängst...

... dann hast du nämlich folgendes:

1. in der Procedure hast du den Socket übergeben bekommen
2. du hast den nick ausgelesen aus dem mit ReceiveText empfangenen
3. du hast die ListBox wo hinten bei Items.Objects[] der Socket drinne steht der dir übergeben wurde
4. Wenn du den Eintrag in 3. gefunden hast, dann kannst du doch einfach seinen Text abändern.
klar, wenn dann aber ein Client was schreibt wird ja jedesmal (!) der nick in die listbox geschrieben !

Wenn ein Client sich einloggt sendet dieser ja automatisch 'MrX hat Raum betreten'.
Nun müsste man doch eigentlich nur ein einziges Mal (für jeden Clienten) diese achricht abfangen und in die Listbox schreiben !?

Muetze1 28. Dez 2004 18:51

Re: Server disconnectet Client
 
Moin!

Zitat:

Zitat von delphman
klar, wenn dann aber ein Client was schreibt wird ja jedesmal (!) der nick in die listbox geschrieben !

Wenn ein Client sich einloggt sendet dieser ja automatisch 'MrX hat Raum betreten'.
Nun müsste man doch eigentlich nur ein einziges Mal (für jeden Clienten) diese achricht abfangen und in die Listbox schreiben !?

Ok, wenn der Client auch immer ständig seinen Nick mitschickt, obwohl der Server ihn ja schon weiss...

Aber dann lass uns doch mal überlegen. Wir müssten uns doch einfach eine Situation raussuchen die nur einmal auftritt und am besten kurz nach dem Verbinden. Also mir fällt da z.B. "Mrx hat den Raum betreten" ein - warum achtest/wartest du nicht auf den Spruch und holst dir da den Nick raus und fügst ihn zur Listbox hinzu - nochmal sollte der Spruch ja nicht kommen.

MfG
Muetze1

PierreB 28. Dez 2004 18:59

Re: Server disconnectet Client
 
Genau daran hab ich auch schon gedacht.
Vielleicht mit POS ? Aber dann müsste man das gesamte memo in einen string kopieren und wie krieg ich dann noch den nick raus selbst wenn ich 'hat den Raum betreten' gefunden habe ?

wie meinst du das, den nick rausholen ?

PierreB 28. Dez 2004 21:52

Re: Server disconnectet Client
 
Hi,

nach langem probieren habe ich es jetzt geschafft ! :party:
Sobald sich ein User einloggt, wird der Nick mit in der ListBox angezeigt !
Hier der Source:
Code:
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
wert, wert1, ib : integer;
begin
edit10.text := 'User eingeloggt: ' + IntToStr(ServerSocket1.Socket.ActiveConnections);
lTemp := Socket.RemoteHost + ' ' + Socket.RemoteAddress;
timer2.Enabled := true;
end;
Sobald sich ein User einloggt, geht der Timer "an". Und im Timer passiert folgendes:
Code:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
if nick <>'' then begin
                  nick:=Copy(nick, 1, 6);
                  test := ltemp + ' ' + nick;
                  ListBox1.Items.AddObject(test, ServerSocket1);
                  timer2.Enabled := false;
                  end;
end;
Sobald ein Client etwas sendet wird die Nachricht abgefangen und das Item der ListBox zugefügt.

Nun gibt es wieder ein neues Problem:
Das User kicken funktioniert jetzt nicht mehr ! :wall:
Fehlermeldung: Ungültige Typumwandlung.

Dabei hat sich doch eigentlich nix verändert, außer der Wert der in die ListBox eingetragen wird ! :gruebel:

Echt schlimm: ein Problem gelöst, kommt ein neues ! :roll:

Muetze1 28. Dez 2004 22:41

Re: Server disconnectet Client
 
Moin!

Aua aua aua...

Deine Variable "nick" ist wohl global und daher fällt deine Methode schonmal flach, wenn sich 2 Nicks/clients direkt nacheinander anmelden, dann haut er die Nicks durcheinander bzw. nutzt den gleichen nick für beide.

Dann nochmal ein Zitat von dir:
Zitat:

Zitat von delphman
Dabei hat sich doch eigentlich nix verändert, außer der Wert der in die ListBox eingetragen wird !

. Wie bitte? Nix verändert? Schonmal geschaut was du nun in der ListBox hinten anhängst? Den ServerSocket. Hmm, warum nur ... frage ich mich. Den ServerSocket kann ich jederzeit und überall bekommen wenn ich ServerSocket1 schreibe - und der ist bei jedem User gleich - also, was soll der denn bei den Usern in der ListBox? Es hilft doch nix wenn überall das gleiche drinne steht. Und bisher ging ich in meinem Code immer davon aus das entweder TUserSocket oder TCustomWinSocket (abhängig welchen Stand man nimmt aus diesem Thread) in Items.Objects[] der ListBox befindet. Nun befindet sich durch dein Code aber TServerSocket drinne - und das ist doch wohl komplett was anderes. Nun ist denke ich mal auch klar, warum das Programm sagt:
Zitat:

Zitat von Das Programm
Ungültige Typumwandlung

, weil nunmal ein TServerSocket kein TCustomSocket und auch kein TCustomWinSocket ist.

Und warum überhaupt mit dem Timer? Warum? Warum bloss? Woher willst du wissen, das bis zum Ablauf des Timers der Nick angekommen ist? Und woher willst du wissen das es der Nick zu dem Socket ist? Du hast einen ServerSocket der haufenweise Clients haben kann.

Dein ganzes Programm sollte im Normalfall Event-driven sein, daher: reagiere auf Ereignisse und handle nicht selber.

Zitat:

Zitat von delphiman
Vielleicht mit POS ? Aber dann müsste man das gesamte memo in einen string kopieren und wie krieg ich dann noch den nick raus selbst wenn ich 'hat den Raum betreten' gefunden habe ?

Wieso das gesamte Memo??? Du bekommst den String doch beim OnClientRead. Diese String untersuchen ob es diese "betreten"-Meldung ist und danach so oder so zum Memo hinzufügen (den gesamten String). Wenn es diese "betreten"-Meldung ist, dann kannst du ja den Nick rausholen und der ListBox zuführen.

Funktionen dazu: Pos(), Copy(), Delete()

MfG
Muetze1

PierreB 28. Dez 2004 22:50

Re: Server disconnectet Client
 
Zitat:

weil nunmal ein TServerSocket kein TCustomSocket und auch kein TCustomWinSocket ist.
Das heißt ich änder das einfach zu TCustomSocket, ja ?
Zitat:

Und warum überhaupt mit dem Timer? Warum? Warum bloss?
Warum nicht ?
Zitat:

Woher willst du wissen, das bis zum Ablauf des Timers der Nick angekommen ist? Und woher willst du wissen das es der Nick zu dem Socket ist? Du hast einen ServerSocket der haufenweise Clients haben kann.
hä? Wenn ein User einloggt wird der Timer aktiviert. Dann prüft er die eingehende Nachricht. Der der Client gleich nach dem Verbinden ja Nickname + hat den Raum betreten sendet, fängt der Timer diese Nachricht ab. er löscht den Rest des Strings und packt den Nick in die ListBox. Danach wird der Timer wieder ausgeschaltet, bis wieder ein Client einloggt. Dann geht das ganze wieder von vorne los !

Zitat:

der ListBox zuführen.
wie füge ich den einem bereits existierenden Item noch etwas hinzu ?

Muetze1 28. Dez 2004 23:14

Re: Server disconnectet Client
 
Moin!

Zitat:

Zitat von delphman
Zitat:

weil nunmal ein TServerSocket kein TCustomSocket und auch kein TCustomWinSocket ist.
Das heißt ich änder das einfach zu TCustomSocket, ja ?

Meinst du wirklich, das ist so einfach? Wenn du es so haben willst wie bisher, dann füge die aktuelle Connections[] - also den Socket - hinzu.

Zitat:

Zitat von delphman
Zitat:

Und warum überhaupt mit dem Timer? Warum? Warum bloss?
Warum nicht ?
Zitat:

Woher willst du wissen, das bis zum Ablauf des Timers der Nick angekommen ist? Und woher willst du wissen das es der Nick zu dem Socket ist? Du hast einen ServerSocket der haufenweise Clients haben kann.
hä? Wenn ein User einloggt wird der Timer aktiviert. Dann prüft er die eingehende Nachricht. Der der Client gleich nach dem Verbinden ja Nickname + hat den Raum betreten sendet, fängt der Timer diese Nachricht ab. er löscht den Rest des Strings und packt den Nick in die ListBox. Danach wird der Timer wieder ausgeschaltet, bis wieder ein Client einloggt. Dann geht das ganze wieder von vorne los !

Ach, und was ist, wenn sich ein 2. Client einloggt bzw. verbindet während der erste den Timer angeschmissen hat, diese aber noch nciht ausgelöst hat? Was ist dann? Wem gehört der Nick? Aus welchem Socket willst du lesen?

Zitat:

Zitat von delphman
Zitat:

der ListBox zuführen.
wie füge ich den einem bereits existierenden Item noch etwas hinzu ?

Delphi-Quellcode:
ListBox1.Items[Index] := 'Was auch immer';
Index ist dabei der Index des Eintrages den du ändern möchtest.

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:02 Uhr.
Seite 3 von 4     123 4      

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