Gå til innhold

Kommunikasjon klasser imellom


Anbefalte innlegg

Jeg sliter med å få klasser til å kommunisere på en god måte.

 

Jeg har fire klasser, Server, User, Login og Chat, (Eksempel).

Server venter på tilkoblinger over nettet, f.eks. telnet.

Når noen kobler til så lages det en User, om legges til Server og Login.

All trafikk fra den tilkoblede klienten går rett til User.

Det er her problemet mitt ligger, hvordan vet User hvilken klasse som skal ha informasjonen som kom inn? (Chat eller Login).

 

Rett etter tilkobling skal all informasjon gå til Login som skal sjekke brukernavn/passord. Om disse stemmer skal User fjernes fra Login og legges til Chat.

Nå skal all informasjon som User får inn fra klienten gå til Chat.

 

Systemet jeg har brukt før er at hver User har en int mode. Denne er default 0. Så har Server en metode void read(User u, String s) {}. Når Server får inn info på read sjekker Server User sin mode, og ved switch sender til rett klasse. Slik:

switch(u.getMode()) {

case 0:

login.read(u, s);

break;

case 1:

chat.read(u, s);

break;

}

 

Dette er en grei løsning, men når jeg fikk mange klasser og flere ting som skal sendes videre ble det mye rot.

 

Noen som vet om en fin måte å sende info til rett klasse?

Har sett litt på interface, men ble bare rot...

Lenke til kommentar
Videoannonse
Annonse
Har du ikke en klient?

9042393[/snapback]

Klienten i dette tilfellet blir vel nesten Telnet. :)

 

Et interface sier bare hvilke metoder som må implementeres, det er ikke det du er på jakt etter.

det du kan gjøre er å opprette en ny "klientHandler" metode f.eks, i den sender du med en input/output variabel, de er knyttet mot klienten. I klienthandleren kan du så utføre login, før du så setter i gang med det du skal.

 

Husk at variabler bare er pekere, så det nytter ikke å opprette et brukerobjekt for alle brukere, du må lage en per bruker. :)

 

while(venteløkke)

if("request) {

new requestHandler;

}}

 

 

PS: Ønsker du noe kode fra et annet program jeg skriver så send meg en PM, det er kode for et kopieringsprogram som blant annet bruker et GUI for å behandle kopieringskøen, og dermed bruker samme objekt i flere klasser.

Endret av Ueland
Lenke til kommentar
Har du ikke en klient?

9042393[/snapback]

Klienten i dette tilfellet blir vel nesten Telnet. :)

 

Et interface sier bare hvilke metoder som må implementeres, det er ikke det du er på jakt etter.

det du kan gjøre er å opprette en ny "klientHandler" metode f.eks, i den sender du med en input/output variabel, de er knyttet mot klienten. I klienthandleren kan du så utføre login, før du så setter i gang med det du skal.

 

Husk at variabler bare er pekere, så det nytter ikke å opprette et brukerobjekt for alle brukere, du må lage en per bruker. :)

 

while(venteløkke)

if("request) {

new requestHandler;

}}

 

 

PS: Ønsker du noe kode fra et annet program jeg skriver så send meg en PM, det er kode for et kopieringsprogram som blant annet bruker et GUI for å behandle kopieringskøen, og dermed bruker samme objekt i flere klasser.

9042424[/snapback]

 

Takk for svar :)

 

Selve server/klient fungerer jo som det skal. Jeg har tross alt skrevet en hel telnetserver, da eksemplet var en liten versjon av den serveren.

 

Jeg har sluttet å bruke handler, altså ClientHandler, og bruker istede bare User.

Det er en tråd som gjør akkurat det samme, den går i løkke og leser alt som kommer inn og ved '\r' sendes alt til Server.

Jeg bruker User fordi den inneholder masse brukervariabler i tillegg.

 

Login vs Chat var bare et eksempel, da jeg i virkeligheten har 11 slike klasser. Og poenget mitt med å få User til å lett vite hvilken klasse om skal ha input har med å gjøre at jeg lett kan legge til flere slike klasser.

Det er jo ikke bare snakk om read(), men buttonPressed() og changeMode() også.

 

Jeg liker bare ikke at User må ha en int som forteller hvilken klasse som skal ha input.

Lenke til kommentar

Jeg løste problemet på en lettere stygg måte.

 

Slik:

 

Object mode;

mode settes til hvilken som helst klassefil.

 

Class[] parameterTypes = { User.class, java.util.ArrayList.class };

mode.getClass().getMethod("read", parameterTypes).invoke(mode, this, in);

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...