Og jeg er kommet så langt som at tage imod data fra klienter og gemme i variabler.
Da jeg ikke har megen erfaring med Java, er jeg stødt ind i et problem i forbindelse med at lave en kø. Jeg har lavet en ny class, SMSServerQueue, som oprettes en enkelt gang når serveren starter (der skal jo kun være een kø).
Ligesom i eksempel på tutorialen har jeg andre klasser, SMSServerThread og SMSServerProtocol. Hvordan kan jeg tilgænge metoderne i den samme "instans" af SMSServerQueue inde fra fx SMSServerProtocol? Fx hvis en SMS skal lægges i køen.
Jeg håber, at det er forklaret, så det forstås. Jeg er ikke helt inde i terminologien der gælder for objekt-orienteret programmering.
siden der kun skal være een eneste kø kan du lade variable og metoder i din klasse SMSServerQueue være statiske. så kan de tilgås allevegnefra med klassenavnet foran det lokale navn i klassen. eg:
class SMSServerQueue { private static Koelement[] koen = new Koelement[100]; // bare et eksempel private static int forste = 0; private static int sidste = 0; // forste==sidste => tom kø
public static tilfoj( Koelement sms ) { if ( (sidste+1)%100 != forste ) { koen[sidste] = sms; sidste = (sidste+1)%100; } else { // grumme fejl. det må ikke ske } } public static hentNeste( ) { if ( forste == sidste ) { // koen er tom. return null; } else { int temp = forste; forste = (forste+1)%100; return koen[temp]; } }
}
fra andre klasser kan du nu kalde SMSServerQueue.tilfoj( element ); og element = SMSServerQueue.hentNeste(); if ( element != null ) { // send den sms }
ups. metoder skal have en type de kan returnere (eller void) public static void tilfoj( Koelement sms ) { // returnere ingenting public static Koelement hentNeste( ) { // returnerer et Koelement (eller null)
Hvis du kun skal have en enkelt kø som skal accesses fra flere klasser, så kan du enten lave en singleton wrapper eller (i dette tilfælde) bare erklære den public static.
Saml dine data i et objekt, det er meget bedre end 3 vektorer.
Der er lige den lille detalje, at den ikke kan kompilere. Jeg vil foreslå at rette SMS-klassen, så den ikke har set-metoder, men i stedet har en constructor der tager 3 argumenter.
Jeg har forsøgt at implementere arne_v's ide, og får følgende fejl ved kompilering:
SMSServerProtocol.java:69: Can't make static reference to method void enq(java.lang.Object) in class SMSServerQueue. SMSServerQueue.enq(new SMSServerSMS(theInput, entered_receiver, entered_type)); ^ SMSServerQueue.java:5: Class LinkedList not found in type declaration. private LinkedList q = null; ^ SMSServerQueue.java:8: Class LinkedList not found in type declaration. q = new LinkedList ();
Det er sikkert bare mig, der som sagt er ny i Java - men I siger selv til, når I mener, at I har udført for 60 points hjælp, ok? :-)
Det tænkte jeg også, men den står på sin plads i filen med klassen SMSServerQueue, hvor LinkedList bruges ... Er LinkedList afhængigt af en bestemt version af JDK?
Nu er den eneste fejl ved kompilering den samme som tidligere nævnt:
SMSServerProtocol.java:69: Can't make static reference to method void enq(java.lang.Object) in class SMSServerQueue. SMSServerQueue.enq(new SMSServerSMS(theInput, entered_receiver, entered_type));
I klassen SMSServerProtocol, hvor SMSen lægges i køen fra, står nu "SMSServerQueue ssq;". I klassen SMSServer, der afvikles som det første, står nu "SMSServerQueue ssq = new SMSServerQueue;"
Der er ingen fejlmeddelelser ved kompilering længere.
Når jeg prøver at lægge en SMS i køen ved at telnette til serveren, skriver den "Invalid data", dvs den har catchet noget ...
try { ssq.enq(new SMSServerSMS(theInput, entered_receiver, entered_type)); theOutput = "OK. Your SMS will be processed."; state = FINISHED; } catch (Exception err) { theOutput = "Invalid data."; state = WAITING_DATA; }
#I klassen SMSServerProtocol, hvor SMSen lægges i køen fra, står nu "SMSServerQueue ssq;". #I klassen SMSServer, der afvikles som det første, står nu "SMSServerQueue ssq = new SMSServerQueue;"
Det skal være SMSServerProtocol.java: public static SMSServerQueue ssq;
og SMSServer.java: SMSServerQueue.ssq = new SMSServerQueue();
Nu skal jeg så bare lave den del, der læser køen og sender SMS ud - men det vil jeg selv prøve :-)
Da det var din (arne_v's) ide jeg bruger, håber jeg at jeg er retfærdig nok ved at give de 60 point til dig ...
Synes godt om
Ny brugerNybegynder
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.