Avatar billede brian-johansen Nybegynder
16. november 2006 - 10:08 Der er 6 kommentarer og
1 løsning

Observer pattern på netværk

Hej,
Det er sådan at jeg er ved at lave en mindre chat app. Men jeg vil gerne have at når folk logger af og på, så bruge et observer pattern til at fortælle alle de andre brugere hvem der er på.

Er der nogen der har et eksempel liggende der kan klare det ?

mvh Brian
Avatar billede jzip Nybegynder
16. november 2006 - 10:54 #1
Hej Brian

Et vigtigt design spørgsmål: hvordan styrer du din chat ? Har du en chat server hvor al kommunikation går igennem, eller har du to eller flere klienter som skal snakke direktet med hinanden.

Hvis du har en chat server, kan observer pattern efter min mening bruges smart. Alle klienter registrer sig som observer på severen der er observable. Når så en klient logger af eller på, laver serveren et notifyAll() kald, dvs. alle klienter som er registreret som observer på serveren, får kaldt deres notify() metode, som f.eks. opdaterer listen af andre klienter på chatten.

Hvis du ikke har en chat server, bliver tingene rodet lidt sammen. Hver klient skal være observable, samt observer. Dvs. hver klient skal registrere sig som observer på alle de andre klienter, og udstille sig som observable.

Lille eksempel på chat server:

Klient registrer sig som observer på chat serveren:

// klient kode
RemoteServer server = new RemoteServer();
Klient k = new Klient();
server.registrerObserver(k);
server.logPaaChatten(k);

Når en klient har kaldt registrerObserver(), sker følgende:
// server kode
public void registrerObserver(Klient k){
  // tilføj klient som observer
  observers.add(k);
}

Når en klient har kaldt logPaaChatten(), sker følgende:
public void logPaaChatten(Klient k){
  foreach(Klient klient in observers){
    klient.notify("OPDATER_KLIENTER_PAA_KLIENT",observers);
  }
}

// Klient kode
publib void notify(string msg,object data){
  if(msg.Equals("OPDATER_KLIENTER_PAA_KLIENT")){
    // opdater listboksen på klienten
    listBox.addItems(data);
  }
}

Håber det kan give dig lidt inspiration til at komme videre :-)

Jzip
Avatar billede brian-johansen Nybegynder
16. november 2006 - 10:59 #2
Hej,
Mange tak for det, ideen er at der skal være en server der tager sig af alt komunikation.

men hvordan skal jeg få det distrubueret ud til klienterne ? skal jeg bare lave en writer der skriver navnet også opdatere klienterne en lokal arraylist eller hvordan ?

mvh Brian
Avatar billede brian-johansen Nybegynder
16. november 2006 - 11:01 #3
Det skal lige siges at jeg bruger alm. TCP sockets, skal jeg kigge på .net remoting får at få adgang til de metoder der ligger på serveren ?
mvh Brian
Avatar billede jzip Nybegynder
16. november 2006 - 13:09 #4
Hej igen

Du behøver ikke at bruge Remoting, din TCP protocol skal bare sende tekst beskeder til henholdvis server og klient. F.eks.

Alle tekst beskeder består af en kommando og nogle parametre:

"KOMMANDO, PARAMETRE"

Klient ønsker at registrer sig som observer på serveren:

"KLI_REGISTRER, KLIENT 127.12.32.12"

Serveren svarer herefter tilbage til klienten:

"SRV_REGISTRER, OK"

Klient ønsker at logge på chatten:

"KLI_LOGIN, USERNAME Jesper"

Serveren svarer nu:

"SRV_LOGIN, OK"

osv...

Serveren sender listen af online chattere:

"SRV:USERS, Jesper, Per, Hans...."
Avatar billede jzip Nybegynder
16. november 2006 - 13:15 #5
Klienten skal så parse tekst beskeden og kalde den respektive kommando/metode:

CMD = MESSAGE.SubString(0,MESSAGE.IndexOf(","));
PARAMS = MESSAGE.SubString(MESSAGE.IndexOf(",")+1);

if(CMD.Equals("SRV_USERS")){
  ArrayList lokaltArray = ParseUsers(PARAMS);
}
else if (CMD....

Som du selv foreslog :-)
Avatar billede brian-johansen Nybegynder
16. januar 2007 - 14:06 #6
Hej, fik det til at virke, men glemte at lukke spørgsmålet, sorry, vil du lige ligge et svar så du kan få nogle points.

mvh Brian
Avatar billede jzip Nybegynder
17. januar 2007 - 08:23 #7
Svaret er her :-) Glad for at kunne hjælpe.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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