Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Server disconnectet Client

  Alt 25. Dez 2004, 23:14
Moin!

Zitat von Muetze1:
1. Warum löscht bei einem einzelnen Connect eines neuen Clients gleich die Listbox? Warum fügst du nicht einfach den Client der Listbox hinten an?

2. Warum nutzt du nicht die AddObject() Methode von TStrings und fügst den ServerSocket1ClientConnect() übergebenen Socket einfach mit an den Eintrag mit an? Dieser ist immer eindeutig zu der Connection.
Delphi-Quellcode:
Procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
Var
  lTemp : String;
Begin
  Memo1.Lines.Add(timetostr(now)+' Neuer User betritt den Chat !');
  edit10.text := 'User eingeloggt: ' + IntToStr(ServerSocket1.Socket.ActiveConnections);

    // die oben übergebene Instanz "Socket" ist der neu angelegte Socket der für diesen neuen Client
    // angelegt wurde bzw. dessen Connection verwaltet. Daher können wir von ihm direkt die benötigten
    // Informationen wie RemoteHost etc abfragen. Ich habe hier mal eine temporäre lokale Variable lTemp
    // angelegt für den String der in ListBox erscheint.
    // Beim AddObject() kannst du ein Object mit angeben was dann zu dem Eintrag mit verwaltet wird. Wenn
    // du also mit Delete einen Eintrag löscht, dann fliegt dieses gleich mit raus. Daher hast du immer
    // zu jedem Eintrag den Socket und kannst z.B. wenn der Nutzer einen Eintrag in der ListBox ausgewählt
    // hat auch direkt diesem Client was schicken - einfach aus ListBox1.Items.Objects[] das Objekt rausholen
    // und zu einem TCustomWinSocket typecasten.

  lTemp := Socket.RemoteHost + ' ' + Socket.RemoteAddress;
  ListBox1.Items.AddObject(lTemp, Socket);
End;
Zitat von Muetze1:
3. Mit dem Vorschlag aus 2. wird es beim ServerSocket1ClientDisconnect() einfacher, weil du dann in dem Objects[] Array nachschauen kannst nach dem Socket der sich verabschiedet hat und somit nur noch den einen Eintrag löschen musst bei der ListBox
Delphi-Quellcode:
Procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
Var
  i : Integer;
Begin
    // Socket ist eindeutig, daher haben wir durch das Connect schon diesen Socket auch in der ListBox.
    // Also: ListBox1.Items.Objects[] durchgehen, schauen wo dieser übergebene Socket ist und dann den
    // Eintrag löschen. Fertig!

  Memo1.Lines.Add(timetostr(now)+' User verlässt den Chat !');
  edit10.text := 'User eingeloggt: ' + IntToStr(ServerSocket1.Socket.ActiveConnections-1); // noch ist ActiveConnections nicht aktuell!

  For i := 0 To ListBox1.Items.Count-1 Do
  Begin
    If ( ListBox1.Items.Objects[i] = Socket ) Then
    Begin
      ListBox1.Items.Delete(i);
      Break;
    End;
  End;
End;
Zitat von Muetze1:
4. Und mit dem Vorschlag aus 2. wird deine eigentliche Frage (disconnecten eines gewählten Clients) auch einfach lösbar: Den Socket wieder aus dem Objects[] Array der ListBox rausholen, zu einem TCustomWinSocket casten und einfach seine Methdoe Close() aufrufen. Fertig ist die Suppe...
Ich gehe jetzt mal davon aus, das du den Client rausschmeissen willst, den der Benutzer in der ListBox ausgewählt hat.

Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
Var
  lSocket : TCustomWinSocket;
Begin
    // wenn ein Eintrag ausgewählt ist...
  If ( ListBox1.ItemIndex > -1 ) Then
  Begin
      // dann den mit AddObject() hinzugefügten Socket mal rausholen
    lSocket := ListBox1.Items.Objects[ ListBox1.ItemIndex ] As TCustomWinSocket;

      // ... und dann einfach den Socket schliessen
    lSocket.Close;
  End;
End;
Voraussetzung für alle von mir hier dargelegten Posts ist es, dass MultiSelection ausgeschaltet ist bei der ListBox!

MfG
Muetze1
  Mit Zitat antworten Zitat