17. juni 2004 - 19:40Der 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?
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"); } } } }
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);
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?
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
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?
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?
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)
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
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
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.