Equals returnerer true fordi det er det samme static objekt som hentes fra en anden klasse, så det er det samme objekt, objektet har blot ændret form siden sidst.
og Daniel hvis du kunne svare tror du så jeg ville spørge her ? :) *g*
Det må du lige forklare lidt nærmere; Hvis det drejer sig om et enkelt, statisk objekt (vektoren), vil den ændring du foretager et sted fra da være gældende over det hele, idet der kun er et eksemplar af vektoren?
Har en klasse med en static variabel, så har jeg flere klasser der bruger denne vector, ændrer jeg fra den ene klasse vectoren, kan den anden klasse ikke se ændringen ?
Enig. - Dit spørgsmål går så på sammenligning af vektorer, men i ovennævnte situation findes der kun én vektor, og så er det jeg spørger, hvad det er, du vil sammenligne..
Der er en klasse med en private static variabel, denne returneres via en metode, først hentes den fra en klasse og smides i en variabel, derefter ændres inholdet fra en anden klasse, derefter sammenlignes den med variablen i den første klasse, men den er stadig det samme som variablen.
De 2 klasser kører på samme tid via hver sin dos promt.
Hvis du har en vektor placeret i en privat, statisk variabel i en klasse, indeholder variablen i virkeligheden blot en reference til vektoren, som er et objekt.
Når du efterfølgende returnerer vektoren vha. en metode, returnerer du faktisk kun referencen, og der eksisterer således fortsat kun et eksemplar af vektoren. Den ændring, du herefter foretager i vektoren, vil således blive foretaget i den oprindelige (og eneste) udgave. Dermed foretager du faktisk en sammenligning mellem en og samme udgave af vektoren, og \"den\" vil naturligvis være ens.
Jeg ved ikke, om det kan have noget at sige, hvis du kører instanserne i hver sin prompt. Du kan evt., for at teste, prøve at afvikle dem som to tråde i stedet.
men jo vectoren burde jo være den samme når den er static... men ellers kan du jo lave en for løkke som løber igennem vectoren og kigger på den enkelte pladser om de er ens..hvis der er en af den som ikke er ens retuneres false og løkken stoppes...
erikjacobsen >> Dejligt at se dig :) Hvordan grejer man det så hvis man gerne vil have noget der er fælles for flere programmer ? og kom nu ikke og sig at man skal bruge en db eller en txt fil...
Hvis du kører to forskellige udgaver af programmet i hver sin prompt uden nogen form for forbindelse, vil der ikke være nogen sammenhæng mellem dem, hvad enten du bruger statiske variable eller ej, da det svarer til at afvikle applikationen på to forskellige fysiske maskiner.
Hvis du alligevel ønsker kommunikation uden hverken database eller filer, skal det vel næsten foregå via en form for netværkskommunikation mellem de to programmer, entet direkte (kan jo sagtens lade sig gøre, selvom de kører på samme maskine) eller gennem et tredie program, som fungerer som serverapplikation.
Hvorfor må det ikke foregå gennem en tekstfil? - Ville det ikke være lettere?
Jeg prøver at lave en chat server og det er beskederne jeg vil gemme i Vectoren, jeg vil gemme dem i en Vector for at gemme dem i rammene fordi jeg tror det vil være hurtigere som en database og eller en txt fil.
Enterprise Java Beans, Java Message System, RMI=Remote Method Invocation (sådan ca. i hvert fald). Det er et stort rum, med masser af veltilpassede værktøjer. Lærer I ikke noget i Esbjerg? :)
Hvis det er tanken, appletterne skal køre på forskellige maskiner, vil browserne ikke tillade direkte kommunikation mellem dem grundet sikkerhedshensyn, så i så fald vil jeg give Erik ret i, at en \"central\" serverapplikation vil være løsningen.
Hvilken kommunikationsmetode, der så vil være bedst skal jeg ikke kunne sige, da jeg kun har arbejdet med rmi (remote method invocation).
Det er jo netop med en central server applikation jeg vil køre, det skal køre som en normal chat og ikke noget med direkte kommunikation mellem clienterne, clienter skal blot kommunikerer med serveren.
Det jeg vil ud i er egentlig at lave en slags \"streaming server\" som streamer indholdet af chatten til alle clienterne.
Okay, men de eksempler som jeg er gået udfra kører med kommunikations mønster der siger client -> server -> Client -> Server osv.
Det jeg i bund og grund vil have er at der er klienterne som læser fra serveren også en anden client der skriver til serveren, men hvordan får man serveren til at håndtere både læsning og skrivning uden at der skal være noget bestemt mønster i det ?
Nu er vi kommet et skridt videre, nu kan vi få serveren til at modtage datas og læseren til at læse data, men den modtager ikke ny data når der kommer ny data via skrive klienten, koden ser sådan her ud:
try { serverSocket = new ServerSocket(8080); } catch (IOException e) { System.err.println(\"Could not listen on port: 8080.\"); System.exit(-1); }
while (listening) new serverTraad(serverSocket.accept()).start(); serverSocket.close(); } } ----------------------------------- serverTraad.java ----------------------------------- import java.io.*; import java.net.*; import java.util.Vector;
public class serverTraad extends Thread { private Socket socket = null; private Vector v = new Vector(); public serverTraad(Socket socket) { super(\"serverTraad\"); this.socket = socket; }
public void run() { try { PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String inLine = \"\";
boolean run = true;
while (run) { v = server.v; System.out.println(v); for (int i = 0; i < v.size(); i++) { out.println(v.get(i)); } inLine = in.readLine(); if (inLine != null) { server.v.add(inLine); }
public class Readclient { public static void main(String[] args) throws IOException
{ Socket kkSocket = null; BufferedReader in = null;
try { kkSocket = new Socket(\"127.0.0.1\", 8080); in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream())); } catch (UnknownHostException e) { System.err.println(\"Don\'t know about host: 127.0.0.1.\"); System.exit(1); } catch (IOException e) { System.err.println(\"Couldn\'t get I/O for the connection to: taranis.\"); System.exit(1); }
String fromServer; boolean run = true; while (run) { while ((fromServer = in.readLine()) != null) { System.out.println(\"Server \" + fromServer); } } in.close(); kkSocket.close(); }
public class writeClient { public static void main(String[] args) throws IOException {
Socket kkSocket = null; PrintWriter out = null;
try { kkSocket = new Socket(\"127.0.0.1\", 8080); out = new PrintWriter(kkSocket.getOutputStream(), true); } catch (UnknownHostException e) { System.err.println(\"Don\'t know about host: taranis.\"); System.exit(1); } catch (IOException e) { System.err.println(\"Couldn\'t get I/O for the connection to: taranis.\"); System.exit(1); }
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); String fromServer; String fromUser;
Vi du ikke godt lære at navngive dine klasser korrekt: med stort begyndelsesbogstav.
Der er ingen grund til at lave en ny Vector i serverTraad
private Vector v = new Vector();
Det bør være tilstrækkeligt at
private Vector v;
Men du har både to klienter, én der modtager og én der skriver. Men f.eks. den der skriver, læser jo ikke noget først. Tror du ikke den blokerer fordi der bliver sendt noget til den, den aldrig vil tage fat i?
Jeg prøver at hjælpe med det her så godt jeg kan, jeg er totalt newbie til Java, men okay!
Alt fungerer som det skal, serveren kører og når man skriver i writeClient.class kommer der data i server.class, og når man så starter Readclient.class printer den også data ud.
Problemet er, Readclient.class læser det tilgængelige data fra vectoren, men når man skriver i writeClient.class kommer der ikke noget data ud i Readclient.class, før man lukker og starter den igen, jeg vil umiddelbart tror det er fordi der ikke er nogen rigtig stream imellem serveren og Readclient.class, jeg tænkte på noget i stil med at Readclient.class måske skal starte sig selv igen når while løkken er stoppet, men hvordan??
Nej, kornfreak, han tester jo netop IKKE bare. Han be\'r om hjælp, og hvorfor skal jeg spilde min tid med at lede efter en variabel \'server\' når han skriver \'server.v\', når det nu er en klasse, og ville have været klart hvis han havde skrevet \'Server.v\'.
ej >> Okay okay, men det er jo kun for at teste om det her virker, jeg skriver det rent bagefter alligevel..men okay, tilbage til problemet, har du et forslag ?
Lad mig så uddybe hvad jeg har skrevet. Både readClient og writeClient åbner en socketforbindelse til serveren, hvor der fra serverens side skrives på og læses på. Men readClient læser kun, og writeClient skriver kun.
Men readClient bliver ik ved med at læse, den viser outout ën gang og hvis man så bruger den der skriver, kommer der ik mere output i readClient, jeg tror det er fordi den skal starte forfra med at læse fra serveren eller sårn noget ?
Den viser også teksten på serveren, og den \"flusher\" teksten ud hele tiden, når man skriver mærkeligt nok..
Nej det kan jeg faktisk ik..hehe..jeg sidder med 3 dospromter åbne en til server, en til read og en til write, for mig virker det logisk at når jeg skriver i den ene skal der komme tekst i de 2 andre af sig selv, og det kommer kun i den ene. Den anden er nødt til at stoppe og starte før der kommer tekst!
Jeg har rodet med det i 4-5 timer nu ..og jeg er slet ik træt *Gg*
Hm..
\"Tror du ikke den blokerer fordi der bliver sendt noget til den, den aldrig vil tage fat i?\"
Der bliver enten læst eller skrevet alt efter om den får data eller ej, så det kan ik være det der er problemet!
De er jo forskellige på det punkt at writeClient har et \"inputfelt\" ..men jeg tror jeg er ved at forstå..mener du at writeClass \"låser\" serveren fordi den ikke fortolker dataen den får ud ?
Grunden til at I kun modtager, når read clienten koblerop, er at det er det eneste tidspunkt I sender noget til denne client. Al anden trafik foregår på den Socket I har åben til write clienten. Hver gang I modtager noget fra write, sender I det tilbage, hvor det kom fra. Og der er der ingen der lytter.
Det kommer an på, hvad I har tænkt jer med den færdige applikation. I skriver noget om at kommunikere beskeder ud til alle clienter. Det vil sige at I skal bruge en form for broadcasting.
Det betyder at I skal bruge en reference til alle forbindelser til alle clienter. Dem kunne I lægge i en anden static Vector eller LinkedList, som I så gennemløber, hver gang I modtager noget.
public class serverTraad extends Thread { private Socket socket = null; private Vector v = new Vector(); private static LinkedList list = new LinkedList(); private PrintWriter out;
public serverTraad(Socket socket) { super(\"serverTraad\"); list.add(this); this.socket = socket; }
public void run() { try { out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String inLine = \"\";
boolean run = true;
while (run) { v = server.v; System.out.println(v); Iterator it = list.iterator(); while (it.hasNext()) { PrintWriter temp = ((serverTraad)it.next()).out; for (int i = 0; i < v.size(); i++) { temp.println(v.get(i)); } } inLine = in.readLine(); if (inLine != null) { server.v.add(inLine); } }
Nå ja, beklager den forvirring det må have skabt at kornfreak overtog mit spm. Beklager også forvirringen omkring navngivning, det kan nok ikke undskyldes.
Kornfreak siger at det virker med greybeard´s kode, og det er jo godt nok så :) Takker alle for deltagelsen i spm :)
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.