AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Server disconnectet Client
Thema durchsuchen
Ansicht
Themen-Optionen

Server disconnectet Client

Ein Thema von PierreB · begonnen am 24. Dez 2004 · letzter Beitrag vom 30. Dez 2004
Antwort Antwort
Seite 3 von 4     123 4      
Muetze1
(Gast)

n/a Beiträge
 
#21

Re: Server disconnectet Client

  Alt 28. Dez 2004, 14:28
Moin!

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
  Mit Zitat antworten Zitat
PierreB
(Gast)

n/a Beiträge
 
#22

Re: Server disconnectet Client

  Alt 28. Dez 2004, 14:33
Ok, du hast Recht !

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 !
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#23

Re: Server disconnectet Client

  Alt 28. Dez 2004, 14:40
Moin!

Zitat von delphman:
Ok, du hast Recht !

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
  Mit Zitat antworten Zitat
PierreB
(Gast)

n/a Beiträge
 
#24

Re: Server disconnectet Client

  Alt 28. Dez 2004, 14:46
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 !?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#25

Re: Server disconnectet Client

  Alt 28. Dez 2004, 18:51
Moin!

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
  Mit Zitat antworten Zitat
PierreB
(Gast)

n/a Beiträge
 
#26

Re: Server disconnectet Client

  Alt 28. Dez 2004, 18:59
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 ?
  Mit Zitat antworten Zitat
PierreB
(Gast)

n/a Beiträge
 
#27

Re: Server disconnectet Client

  Alt 28. Dez 2004, 21:52
Hi,

nach langem probieren habe ich es jetzt geschafft !
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 !
Fehlermeldung: Ungültige Typumwandlung.

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

Echt schlimm: ein Problem gelöst, kommt ein neues !
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#28

Re: Server disconnectet Client

  Alt 28. Dez 2004, 22:41
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 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 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 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
  Mit Zitat antworten Zitat
PierreB
(Gast)

n/a Beiträge
 
#29

Re: Server disconnectet Client

  Alt 28. Dez 2004, 22:50
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 ?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#30

Re: Server disconnectet Client

  Alt 28. Dez 2004, 23:14
Moin!

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 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 von delphman:
Zitat:
der ListBox zuführen.
wie füge ich den einem bereits existierenden Item noch etwas hinzu ?
ListBox1.Items[Index] := 'Was auch immer'; Index ist dabei der Index des Eintrages den du ändern möchtest.

MfG
Muetze1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:04 Uhr.
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