Avatar billede netsrac Praktikant
26. december 2001 - 17:52 Der er 70 kommentarer og
1 løsning

CompareTo på Vector

Hvordan sammenligner man to vectorer for at se om de indeholder det samme, har forsøgt med compareTo, men det vil ikke virke ?
Avatar billede sajbar Nybegynder
26. december 2001 - 17:55 #1
prøv equals..
Avatar billede netsrac Praktikant
26. december 2001 - 18:00 #2
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*
Avatar billede sa Nybegynder
26. december 2001 - 18:17 #3
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?
Avatar billede netsrac Praktikant
26. december 2001 - 18:19 #4
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 ?
Avatar billede sa Nybegynder
26. december 2001 - 18:21 #5
Jo, netop, idet der kun findes én udgave af vektoren, men hvad er det så, du vil sammenligne?
Avatar billede netsrac Praktikant
26. december 2001 - 18:23 #6
Indholdet af den éne vector ændres fra en klasse også skulle den ændring vel være at se i en anden klasse netop fordi der kun er ´en ?
Avatar billede sa Nybegynder
26. december 2001 - 18:25 #7
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..
Avatar billede netsrac Praktikant
26. december 2001 - 18:29 #8
Okay, så tager vi den lige fra bunden.

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.
Avatar billede sa Nybegynder
26. december 2001 - 18:36 #9
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.
Avatar billede netsrac Praktikant
26. december 2001 - 18:40 #10
Den ændrer sig netop ikke, jeg har fjernet sammenligningen og udskriver vectoren istedet, men den ændrer sig ikke ?
Avatar billede netsrac Praktikant
26. december 2001 - 18:41 #11
Vectoren burde jo i kraft af at den er static være den samme og indeholde det samme for alle klasser der bruger den ?
Avatar billede sa Nybegynder
26. december 2001 - 18:46 #12
Det burde den i realiteten.

Har du prøvet at lade den være statisk \"variabel\" i selve den klasse, som bruger den, og som der kører flere instanser af?
Avatar billede sa Nybegynder
26. december 2001 - 18:47 #13
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.
Avatar billede erikjacobsen Ekspert
26. december 2001 - 18:48 #14
Kode?
Avatar billede erikjacobsen Ekspert
26. december 2001 - 18:49 #15
Nå, hov, netsrac. Du har to programmer. Det der med static, og én udgave,
gælder kun i ét og samme program :)
Avatar billede sajbar Nybegynder
26. december 2001 - 18:50 #16
man havde da lov at håbe *G*

god jul  DAH ;)

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...
Avatar billede netsrac Praktikant
26. december 2001 - 18:52 #17
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...
Avatar billede sa Nybegynder
26. december 2001 - 18:57 #18
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?
Avatar billede sajbar Nybegynder
26. december 2001 - 19:00 #19
sa...jeg vil også sige at en txtfil ville være det nemeste...men netsrac har det med at være vanskelig...;)
Avatar billede netsrac Praktikant
26. december 2001 - 19:01 #20
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.
Avatar billede erikjacobsen Ekspert
26. december 2001 - 19:02 #21
Kører du det som JSP bruger du bønner med application scope
Avatar billede sa Nybegynder
26. december 2001 - 19:02 #22
.. men en chat vil da normalt ikke køre på samme maskine, eller..?

Så vil jeg tro, du skal over i retning af noget broadcasting eller rmi, hvor der kører en \"serverapplikation\"..
Avatar billede netsrac Praktikant
26. december 2001 - 19:05 #23
Det kører ikke som bønner, det skal køre som en applet som snakker med JavaScript via JSObject.
Avatar billede erikjacobsen Ekspert
26. december 2001 - 19:11 #24
Så sæt en application server op, og snak med en EJB vi JMS
Avatar billede netsrac Praktikant
26. december 2001 - 19:12 #25
sa >> Det er skrevet som en server applikation med nogle clienter der connecter til den og læser vectoren.

Så er der lavet en test klasse som skriver til vectoren i server klassen, men clienterne modtager ikke noget nyt.
Avatar billede netsrac Praktikant
26. december 2001 - 19:13 #26
erikjacobsen >> også var det Carsten stod af, EJB og JMS ?
Avatar billede erikjacobsen Ekspert
26. december 2001 - 19:14 #27
connecter ?? Hvordan ?
Avatar billede netsrac Praktikant
26. december 2001 - 19:15 #28
I ASP har man f.eks. en Application som er global for alle bruger / programmer, kan man ikke lave noget i samme stil i java ?
Avatar billede erikjacobsen Ekspert
26. december 2001 - 19:16 #29
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? :)
Avatar billede netsrac Praktikant
26. december 2001 - 19:16 #30
Erikjacobsen >> connecter via Socket og serveren kører med en ServerSocket.
Avatar billede sa Nybegynder
26. december 2001 - 19:16 #31
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).
Avatar billede erikjacobsen Ekspert
26. december 2001 - 19:17 #32
Hvis du kører JSP har du noget der ligner en application-variabel. Men det vil du
jo ikke ...!
Avatar billede netsrac Praktikant
26. december 2001 - 19:18 #33
Erikjacobsen >> Tydeligvis ikke nok for så havde jeg jo bare lavet det istedet for at sidde her :)
Avatar billede erikjacobsen Ekspert
26. december 2001 - 19:18 #34
Er det via din socket forbindelse at du får en KOPI af din vector? Så
er det nemlig kun en kopi.
Avatar billede netsrac Praktikant
26. december 2001 - 19:20 #35
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.
Avatar billede netsrac Praktikant
26. december 2001 - 19:22 #36
ej >> Nej det er 2 klasser på serveren som kommunikerer udveksler vectoren.
Avatar billede netsrac Praktikant
26. december 2001 - 19:22 #37
udveksler vectoren. = der udveksler vectoren. 
Avatar billede erikjacobsen Ekspert
26. december 2001 - 19:23 #38
Ok, og det kan du så ikke. Hvorfor ikke en socket forbindelsen mellem de 2 ?
Avatar billede netsrac Praktikant
26. december 2001 - 19:25 #39
En socket forbidelse mellem de to klasser på serveren ?
Avatar billede erikjacobsen Ekspert
26. december 2001 - 19:25 #40
Ja, de deler jo ikke adresserum, så de skal kommunikere på en eller anden
måde.
Avatar billede sa Nybegynder
26. december 2001 - 19:27 #41
Hvorfor ikke have dem som samme applikationsprogram på serveren?
Avatar billede netsrac Praktikant
26. december 2001 - 19:51 #42
sa >> Hvad mener du med det ?
Avatar billede erikjacobsen Ekspert
26. december 2001 - 19:56 #43
Vi undrer os bare over hvorfor du skal have to programmer kørende på
serveren?
Avatar billede netsrac Praktikant
26. december 2001 - 20:01 #44
Det gør der heller ik. Det eneste der kører på serveren er serveren også et test program der skriver ny data til vectoren.
Avatar billede erikjacobsen Ekspert
26. december 2001 - 20:05 #45
Hvis de rigtige klienter bruger sockets skal dit testprogram da også ??
Avatar billede netsrac Praktikant
26. december 2001 - 20:10 #46
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 ?
Avatar billede erikjacobsen Ekspert
26. december 2001 - 20:11 #47
tråde?
Avatar billede netsrac Praktikant
26. december 2001 - 20:13 #48
Det har vi jo snakket om før, hvordan er det lige jeg bruger dem ?
Avatar billede sajbar Nybegynder
26. december 2001 - 21:23 #49
det er åbenbart en MEGET stor hemlighed..
Avatar billede netsrac Praktikant
26. december 2001 - 21:28 #50
:)

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:

server.java
------------------------------
import java.io.*;
import java.net.*;
import java.util.Vector;

public class server
{
    public static Vector v = new Vector();
   
    public static void main(String args[]) throws IOException
    {
        ServerSocket serverSocket = null;
        ServerSocket readServer = null;
        boolean listening = true;

        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);
                }
               
            }
       
            out.close();
            socket.close();

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}
----------------------------------------
Readclient.java
----------------------------------------
import java.io.*;
import java.net.*;

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();
    }



}
---------------------------------------------
writeClient.java
---------------------------------------------
import java.io.*;
import java.net.*;

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;

        fromUser = stdIn.readLine();
        while (fromUser != null)
        {
            System.out.println(\"Client: \" + fromUser);
            out.println(fromUser);
            fromUser = stdIn.readLine();
        }
       
        out.close();
        stdIn.close();
        kkSocket.close();
    }
}
Avatar billede erikjacobsen Ekspert
26. december 2001 - 23:50 #51
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?
Avatar billede kornfreak Nybegynder
26. december 2001 - 23:58 #52
ej >> Han testede jo bare :)

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??
Avatar billede erikjacobsen Ekspert
27. december 2001 - 00:02 #53
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\'.
Avatar billede kornfreak Nybegynder
27. december 2001 - 00:03 #54
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 ?
Avatar billede kornfreak Nybegynder
27. december 2001 - 00:05 #55
Vi har sat i 2 dage og bøvlet med det her, det er sgu ikke umiddelbart så ligetil som jeg troede :)
Avatar billede erikjacobsen Ekspert
27. december 2001 - 00:09 #56
Du er sammen med netsrac? Jamen, læs det sidste jeg skrev. Der er mit
forslag.

Og man skal altså overholde navngivningskonventionerne. Også selv om
man tester - ellers bliver I da først til grin ... :)
Avatar billede kornfreak Nybegynder
27. december 2001 - 00:10 #57
Han er gået hjem nu, men jeg roder stadig med det!

Det problem vi havde i starten er faktisk løst nu ved en mindre omrykning, nu mangler vi bare at finde ud af den fejl jeg skrev lige før!

Jeg ved faktisk ik precist hvor fejlen lå!
Avatar billede kornfreak Nybegynder
27. december 2001 - 00:14 #58
\"Og man skal altså overholde navngivningskonventionerne. Også selv om
man tester - ellers bliver I da først til grin ... :) \"

Det kan jeg leve med, men ved ik med netsrac ..hehe ;)
Avatar billede erikjacobsen Ekspert
27. december 2001 - 00:15 #59
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.
Avatar billede kornfreak Nybegynder
27. december 2001 - 00:17 #60
Nemlig, det er hele pointen ;)

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..
Avatar billede erikjacobsen Ekspert
27. december 2001 - 00:21 #61
Du kan ikke se det problem jeg beskriver? Prøv at sove på det. :)
Avatar billede kornfreak Nybegynder
27. december 2001 - 00:24 #62
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!
Avatar billede erikjacobsen Ekspert
27. december 2001 - 00:29 #63
På serveren bliver der jo ikke enten læst eller skrevet, der gør I altid
begge dele, uanset om det er den ene eller anden klient.

Der er ingen magi i at du kalder den ene klasse for noget med read og den
anden for noget med write. Det er det der står i dem, der betyder noget.
Avatar billede kornfreak Nybegynder
27. december 2001 - 00:34 #64
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 ?
Avatar billede erikjacobsen Ekspert
27. december 2001 - 00:36 #65
Nej - jeg giver op. Snak med netsrac om det en anden dag. Han
plejer at virke meget fornuftig. Jeg kan li\'som ikke formulere det
på flere måder :)
Avatar billede kornfreak Nybegynder
27. december 2001 - 00:38 #66
Okay, jeg sagde også jeg var en newbie, tak for hjælpen ;)
Avatar billede kornfreak Nybegynder
27. december 2001 - 01:09 #67
iih...jeg kan se et problem, som er at serverTraad.java både skriver og læser helt af sig selv ligeså snart den bliver \"startet\" .. :(
Avatar billede greybeard Nybegynder
27. december 2001 - 02:05 #68
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.
Avatar billede kornfreak Nybegynder
27. december 2001 - 03:02 #69
Nå for søren!
Har du et forslag til hvordan det kan ændres ?
Avatar billede greybeard Nybegynder
27. december 2001 - 08:15 #70
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.

import java.io.*;
import java.net.*;
import java.util.*;

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);
                    }
            }
       
            out.close();
            socket.close();

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}
Avatar billede netsrac Praktikant
28. december 2001 - 12:11 #71
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 :)
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