Avatar billede boris Mester
15. maj 2001 - 19:12 Der er 3 kommentarer og
1 løsning

Fra ServerSocket til en bestemt klient

Når en række klienter har oprettet sockets til en serversocket i Delphi, kan de sende beskeder til serveren, men er der en god og sikker måde at få serveren til at skrive til en bestemt af klienterne? ( Connections[] giver error, hvis man kommer uden for arrayet)
Avatar billede borrisholt Novice
16. maj 2001 - 07:19 #1
boris >> Som du allerede selv har fundet ud af så er der en datastruktur der hedder Connections. Findusen med den er at det er et nul baseret array. Eller kan i hvertfald opfattes sådan (det er nok nærmmer en TList).

Lad tage et scenario :

Client1 connetcter.
Client2 connetcter.
Client3 connetcter.

på pladserne henholdsvis 0,1 og 2 har du Clienterne 1,2 og 3.

Fidusen er hvis så du vil klient nummer 2 noget så skal du tilgå <DinServerSocket>.Connections[1].DoWhatEver()

Connections[] her valgte du altså nummer 1 fordi 2-1 er 1.

Hvis dette ikke besvarer dit spørgsmål, må du rykke ud med noget kode, fordi det et ikke standard sockets du benytter og derfor er det svært for mig at blive mere konkret.

Jens B http://fotx.net/borrisholt
Avatar billede boris Mester
16. maj 2001 - 09:00 #2
Tak for svaret, det er også sådan jeg har opfattet det. Det er også nemt nok, hvis jeg kender klienterne og antallet. Men selve problemet er, at jeg ikke på forhånd ved, hvilke klienter og hvor mange der er. Og hvis jeg kommer til at skrive til en klient, der ikke findes, går programmet ned med en error, fordi det er ude over kanten af arrayet. Jeg ville egentlig bare gerne kunne adressere en meddelelse til en bestemt klient ud fra et ID, IP-nummer eller andet på en nem og sikker måde.
Avatar billede borrisholt Novice
16. maj 2001 - 09:24 #3
Din server socket har en OnConnectevent på det får du en masse informationer on den Client der connecter... Dem gemmer du allerede i din Connections struktur.

Hvis nu du er rigtig snedig .. Så skriver du dig din egen connections struktur baseret på en TList. Altså noget alla det her :

unit Unit2;

interface

uses
  Classes;

type
  tagUser = packed record
    id : Integer;
    ip : String;
  end;
  pUser = ^tagUser;
  TUser = tagUser;


  TUserList = class(TList)
  protected
    function GetUser(Index: integer): TUser;
    property Items;
  public
    Destructor Destroy; override;
    Procedure Add(const User : TUser);
    Procedure Clear; override;
    procedure Delete(const User : TUser);
    Function UserToIndex(const User : TUser) : Integer;

    property Count;
    property Users[Index: integer]: TUser read GetUser; default;
  end;


implementation


destructor TUserList.Destroy;
begin
  Clear;
end;

Procedure TUserList.Add(const User : TUser);
var
  aUser : pUser;
begin
  aUser := new (pUser);
  aUser^.id := User.id;
  aUser^.ip := User.ip;
  inherited Add(aUser);
end;

function TUserList.GetUser(Index: integer): TUser;
begin
  Result := pUser(List[index])^;
end;

procedure TUserList.Delete(const User : TUser);
begin
  inherited Delete(UserToIndex(User));
end;

Procedure TUserList.Clear;
var
  User : pUser;
  i : Integer;
begin
  i:= Count;
  While i > 0 do
    begin
        User := List[pred(i)]; // Set User equal to the last element in the list
        dispose(User);
        dec(i);
    end;
  inherited clear;
end;

function TUserList.UserToIndex(const User: TUser): Integer;
begin
  Result := IndexOf(@User);
end;


end.


Så har du en liste du kan søge i og gøre ved på ppræcis som du kan med en TList. Det vil løse alle dine problemer. Næsten da. :-)

Jens B
Avatar billede boris Mester
16. maj 2001 - 10:23 #4
Tak for svaret. Som jeg forstår det er der ingen vej uden om, at man skal lave sin egen lille brugerdatabase/liste.
Tak for inspirationen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester