Avatar billede bumle90 Nybegynder
17. juni 2004 - 19:40 Der er 31 kommentarer og
1 løsning

Problemer med at kontakte server fra JApplet

Jeg har en lille webserver der kører på port 8001.
Jeg har en JApplet der skal kunne kontakte serveren hvorfra webserveren kører, blot på en anden port. Det vil sige det er altså en anden tråd der ligger og lytter på port 8002 hvor min JApplet skal oprette forbindelse til.
I min JApplet gør jeg følgende:

    public void init() {
   
        try{
        Socket me=new Socket("localhost",8002);
        obOStreamDB = new ObjectOutputStream(me.getOutputStream()); 
        obIStreamDB = new ObjectInputStream(me.getInputStream());
        //obOStreamDB.writeObject(new msgobj("test","im testing"));
        msgobj msg=new msgobj("test","im testing");
        JOptionPane.showInputDialog(this,new String(msg.getCommand()));
        }catch(Exception e)
        {e.printStackTrace();}
    }
Jeg skal altså ikke engang sende noget, blot oprette forbindelse, lave et nyt msgobj og vise indholdet i i en pop-op. Grunden til dette er at msgobj er mit eget objekt, som jeg har liggende som en jar fil på serveren.

Når jeg åbner browseren og taster localhost:8001 sker der så ingenting. Den står bare og hænger og siger Loading Java Applet. Det er ikke fordi JApplet ikke virker, for hvis jeg bare viser en applet med swing osv. virker det finr. Det er først hvis jeg begynder at oprette forbindelse til localhost:8002 at der opstår problemer.
Prøver jeg ligefrem at sende msgojektet via en ObjectOutputStream bliver der på min webserver kastet en FileNotFoundException.
Hvad kan dette skyldes?
Avatar billede arne_v Ekspert
17. juni 2004 - 19:42 #1
Hvordan ser koden ud på server siden ?
Avatar billede bumle90 Nybegynder
17. juni 2004 - 19:44 #2
Altså jeg har en appletlistener der kører på port 8002. Den ser således ud:
public class AppletServer extends BasicThread
{
   
    ObjectOutputStream obOStreamDB;
    ObjectInputStream obIStreamDB;
   
    public AppletServer(Socket client) throws IOException
    {
        this.client=client;
        obOStreamDB = new ObjectOutputStream(client.getOutputStream()); 
        obIStreamDB = new ObjectInputStream(client.getInputStream());
    }

    public void run()
    {
        boolean alive=true;
        while(alive)
        {
            try{
            msgobj returnData=(msgobj)obIStreamDB.readObject();   
            System.out.println("\nfoer");
            if(((String)returnData.getCommand()).equals("test"))
                obOStreamDB.writeObject(new msgobj("triumph","success"));
            System.out.println("\nefter");
            }
            catch(ClassNotFoundException cnfe)
            {   
                cnfe.printStackTrace();
                //returnData= new msgobj("error", "ingen forbindelse til db-server");
            }
            catch(IOException ioe)
            {
                ioe.printStackTrace();
                //System.out.println("----Error ingen forbindelse til DB, from thread" + threadID);
                //returnData= new msgobj("error", "ingen forbindelse til db-server");
            }
        }   
    }       
}

tråden der styrer webben ser således ud :

public class WWWThread extends BasicThread {

    /** Constants */
    private String DEFAULT_INDEX = "index.html";
    private String HTML_ROOT = "html";
    private boolean LOG_TO_CONSOLE = false;

    /** Client connection */
    private Socket client;

    public WWWThread(Socket client) {
        this.client = client;
    }
   
    public void run() {
        try {
            // Fetch the streams
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            OutputStream out = client.getOutputStream();

            // Fetch the requested file
            String str = in.readLine();
            str = str.substring(str.indexOf("/")+1);
            if (str.indexOf(" ") != -1)
                str = str.substring(0, str.indexOf(" "));
            if (str.equals(""))
                str = DEFAULT_INDEX;           

            // Log the request
            if (LOG_TO_CONSOLE)
                System.out.println("The requested file was: " + str);

            // Empty the input stream           
            while(!in.readLine().equals(""));           

            // Send the header
            File file = new File("html/" + str);

            String header = "HTTP/1.0 200 OK\r\n"
                        + "Content-type: text/plain\r\n"
                        + "Content-length: " + file.length() + "\r\n\r\n";
            out.write(header.getBytes());

            // Send the file   
            System.out.println("Path: "+file.getPath());
            FileInputStream fis = new FileInputStream (file);
            int data;
            while((data = fis.read()) != -1) {
                out.write(data);
            }
            fis.close ();

            // Flush the stream
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (IOException ignored) {}
        }
    }
}
Avatar billede bumle90 Nybegynder
17. juni 2004 - 19:52 #3
Den kan ikke finde mit msgobj. Det forstår jeg ikke helt, for den bruger slet ikke msgobj nemlig. Apletten der bliver loadet opretter godt nok en instans af det objekt. Er det nok til at den ikke kan finde den jar fil?
Avatar billede bumle90 Nybegynder
17. juni 2004 - 20:04 #4
Har du en ide til hvad der kan være galt?
Avatar billede arne_v Ekspert
17. juni 2004 - 20:09 #5
Nej - jeg kan slet ikke gennemskue hvad der sker.
Avatar billede bumle90 Nybegynder
17. juni 2004 - 20:09 #6
Hvilken del af det kan du ikke gennemskue?
Du har godt nok heller ikke fået hele koden...
Avatar billede arne_v Ekspert
17. juni 2004 - 20:19 #7
Hvordan koden bliver kaldt og præcis hvor fejlen opstår.
Avatar billede bumle90 Nybegynder
17. juni 2004 - 20:25 #8
Må jeg sende det til din mail?
Bare sådan så jeg ikke blotter det 100% for offentligheden
Avatar billede arne_v Ekspert
17. juni 2004 - 20:27 #9
Ja
Avatar billede bumle90 Nybegynder
17. juni 2004 - 20:31 #10
okay, hvad er din adr?
Avatar billede arne_v Ekspert
17. juni 2004 - 20:34 #11
arne_v@mail.danbbs.dk
Avatar billede bumle90 Nybegynder
17. juni 2004 - 20:50 #12
okay, den er sendt. Har du modtaget den?
Avatar billede arne_v Ekspert
17. juni 2004 - 20:52 #13
Jep

Jeg kigger på det i løbet af aftenen
Avatar billede bumle90 Nybegynder
17. juni 2004 - 20:55 #14
Mange tak...du er en knag arne :)
Avatar billede arne_v Ekspert
17. juni 2004 - 21:16 #15
Ja første problem er at appletten ikke kan finde msgobj klassen.
Avatar billede arne_v Ekspert
17. juni 2004 - 21:18 #16
Efter at msgobj.class blev udpakket til samme dir som applet .class filen, så
kom der ikke længere nogen fejl.

(men der skete nu heller ikke noget)
Avatar billede bumle90 Nybegynder
17. juni 2004 - 22:09 #17
hmmmm hvorfor kan den ikke det?
Jeg vil jo gerne have min pakke liggende et centralt sted...kan jeg evt. referere til den fra appletten?
Avatar billede arne_v Ekspert
17. juni 2004 - 22:11 #18
Jeg mener at du kan:
  - pakke din applet en jar fil
  - angive den jar fil i codebase i HTML
  - lade manifestet i den jar fil have et Class-Path direktiv som angiver msgobj.jar
  - have msgobj.jar i samme dir som HTML og applet jar fil
Avatar billede bumle90 Nybegynder
17. juni 2004 - 22:14 #19
ahhh okay, eller måske evt. bare pakke det hele ned i en jar fil?
Avatar billede arne_v Ekspert
17. juni 2004 - 22:16 #20
Det gør det meget nemmere.

Men så har du også appletten med, når jar filen skal bruges andre steder.
Avatar billede bumle90 Nybegynder
17. juni 2004 - 22:31 #21
ja oki...det har du ret i...det er måske ikke så smart igen...hmmmm
Det skal da også altid være så besværligt
Hvis jeg så gør som du foreslå, er jeg så virkelig nødsaget til at have msgobj i samme arkiv som appletten?
Kan man ikke refere til den fra manifestfilen hvis den ligger andetsteds?
Avatar billede arne_v Ekspert
17. juni 2004 - 22:32 #22
Det er muligt at man kan angive sti også i Class-Path direktivet - jeg har adrig prøvet
Avatar billede bumle90 Nybegynder
17. juni 2004 - 22:34 #23
Okay, hvordan skal den manifest fil der se ud?
Avatar billede arne_v Ekspert
17. juni 2004 - 22:37 #24
Avatar billede bumle90 Nybegynder
17. juni 2004 - 23:43 #25
Okay jeg har nu følgende i min index.html:
<html>
<applet codebase="Vaerkfoerer.jar" code="" width=600 height=400>
</applet>
<html>
Lavet en jar file Vaerkfoerer.jar der ligger i /html. Den indeholder:
Vaerkfoerer.class
META-INF ->MANIFEST.MF

I manifestet står der:
Manifest-Version: 1.0
Class-Path: msgobj.jar
Created-By: 1.4.2_04 (Sun Microsystems Inc.)

i /html ligger også msgobj.jar som jeg referer til i applet-manifest filen.
Det virker stadig ikke. Er der noget jeg har gjort galt?
Avatar billede bumle90 Nybegynder
18. juni 2004 - 00:14 #26
Nu er det så godt nok bare ikke msgobj men selve jar filen den brokker sig over. Nemlig
java.io.FileNotFoundException: html\Vaerkfoerer\jar.class (The system cannot fin
d the path specified)
Avatar billede bumle90 Nybegynder
18. juni 2004 - 00:56 #27
Hmmm okay, jeg tilføjede en archive attribut i <applet> så den nu ser således ud:
<applet codebase="." code="Vaerkfoerer.class" archive="Vaerkfoerer.jar" width=600 height=400>
</applet>
Det hjalp på ovenstående fejl, men nu får jeg fejl med msgobjektet igen.
hmmm meget mystisk. Har prøvet at putte msgobj.jar ind i archive også
Jeg forstår det ikke helt
Avatar billede bumle90 Nybegynder
18. juni 2004 - 10:10 #28
Hm, oki nu fandt jeg ud af det.
Tilsyneladende er det nok bare at skrive i archive attributten hvilke jar filer der skal bruges. SEPERET MED KOMMA VEL OG MÆRKE. Det tog mig lang tid at finde ud af da jeg bare havde brugt mellemrum.
Så skriv i archive hvilke jar-filer appletten skal bruger sepereret med komma, og skriv i code attributten hvilken classfil der indeholder init(). Husk at alle stier er relative :)
Arne læg et svar så får du pointene for indsatssen
Avatar billede bumle90 Nybegynder
18. juni 2004 - 10:10 #29
-s
Avatar billede arne_v Ekspert
18. juni 2004 - 11:11 #30
ok
Avatar billede arne_v Ekspert
09. juli 2004 - 23:40 #31
Tid at få lukket spørgsmålet ?
Avatar billede arne_v Ekspert
22. august 2004 - 23:20 #32
?
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