Avatar billede mikze Nybegynder
11. april 2006 - 16:49 Der er 16 kommentarer

Applet "timeout"

Hej,

Jeg har forstået at når min java-applet på min hjemmeside skal snakke sammen med mit java-program der bliver kørt på localhost, så skal jeg bruge sockets.

Mit problem er, at når jeg indsætter min kode i min applet, starter den simpelt nok ikke. Den står bare ved Loading ... skærmen og kommer ikke videre. Hvis jeg gør så den først opretter forbindelsen senere (ved at aktiverer opretforbindelse() med et tastetryk), så svarer programmet ikke lige efter denne funktion er kørt.

Hvis jeg modsat opretter en forbindelse til min server hver gang jeg skal sende noget data, så virker det fint. Men det er ikke det jeg vil.

Hvordan kan jeg gøre sådan programmet stadig svarer, uden at oprette en ny forbindelse hver gang der skal sendes data?

Jeg har denne som funktion:


    public void opretforbindelse(String brugernavn) {

        try {
            Socket s = new Socket("localhost", 15964);
            netpw = new PrintWriter(s.getOutputStream(), true);
            netbr = new BufferedReader(new InputStreamReader(s.getInputStream()));

            netpw.println("LOGIN " + brugernavn);

            String line;
            while((line = netbr.readLine()) != null) {
                System.out.println("Modtog: "+line);
                newInput = line;
                repaint();
            }

            netbr.close();
            netpw.close();
            s.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }





Jeg har prøvet at kalde funktionen i start, init og ved tastetryk, men der er ingen forskel. Programmet står fast (forskellen er dog at programmet slet ikke bliver "paintet" hvis den er i start eller init).
Avatar billede _carsten Nybegynder
11. april 2006 - 16:55 #1
Prøv at erklære 's' som en instance variabel

private Socket s;

    public void opretforbindelse(String brugernavn) {

        try {
            s = new Socket("localhost", 15964);

    ..............
    ...........
Avatar billede mikze Nybegynder
11. april 2006 - 17:13 #2
Hjalp ingenting, desværre
Avatar billede _carsten Nybegynder
11. april 2006 - 17:17 #3
Husk på - du lukker jo din forbindelse igen her

              .......
            netbr.close();
            netpw.close();
            s.close();  // HER
Avatar billede _carsten Nybegynder
11. april 2006 - 17:31 #4
Har du fjernet s.close() ??
Avatar billede schwarz84 Nybegynder
11. april 2006 - 17:34 #5
Er det korrekt forstået at appletten skal køre på samme computer som du forsøger at forbinde til?
Avatar billede mikze Nybegynder
11. april 2006 - 18:46 #6
Ja lige nu skal den.

I praksis skal den selvfølgelig connecte til min eksterne IP, og så skal det være andre folk udefra der skal oprette forbindelsen.

Nej jeg prøver lige at fjerne s.close().
Avatar billede mikze Nybegynder
11. april 2006 - 18:55 #7
Når jeg fjerner s.close(); er der ingen ændring. :-(
Avatar billede arne_v Ekspert
11. april 2006 - 23:39 #8
proev og kig i java console efter fejlmeddelser
Avatar billede mikze Nybegynder
12. april 2006 - 15:21 #9
Når jeg compiler scriptet melder den ingen fejl, og det gør den heller ikke når jeg kører scriptet.

Men når jeg trykker på en tast (det er det som kalder funktionen opretforbindelse("mikze"), så fryser både firefox OG java-console fast (det nytter ikke noget hvis jeg bruger IE i stedet for). Men hvis jeg så trykker på kryds, altså lukker serveren, som IKKE kører over applet, så svarer appletten igen, men der er ikke kommet nogle fejlmeddelelser i Java Console, udover "Connection Reset".
Avatar billede mikze Nybegynder
12. april 2006 - 15:27 #10
Når jeg trykker på tasten modtager serveren i øvrigt godt den første kommando, og udskriver at den valgte bruger logger ind.


Jeg tænker lidt over om det kan være den while() som er inde i try'en som er i opretforbindelse(). Altså at netbr.readline() aldrig bliver null? Om der måske inde i whilen skal sættes: line = netbr.readLine(); som jeg mener at have set før?

Eller måske fordi at appletten ikke gider at "painte" før den while er færdig, og den derved bliver ved med at tænke den while igennem og fryser fast?
Avatar billede _carsten Nybegynder
12. april 2006 - 15:54 #11
Hvorfor har du dog ikke tænkt på det noget før :-)

Prøv at rette til:

String line = "";
while((line = netbr.readLine()).length() != 0) {
Avatar billede _carsten Nybegynder
12. april 2006 - 16:00 #12
Det er faktisk bedre at gøre det på denne måde

            String line;
            while((line = netbr.readLine()) != null) {
                System.out.println("Modtog: "+line);
                newInput = line;
                line = null;
                repaint();
            }
Avatar billede mikze Nybegynder
12. april 2006 - 17:05 #13
Ingen af eksemplerne virker! :-(

Men nu er vi da mere sikre på hvad problemet er :-)

Jeg har prøvet at fjerne hele den der while(), og så fryser appletten ikke. Men ingen af dine eksempler virker (hvilket jeg også synes som mærkeligt da jeg godt kan læse den kode) :P
Avatar billede mikze Nybegynder
12. april 2006 - 17:06 #14
String line;
            while((line = netbr.readLine()) != null) {
                System.out.println("Modtog: "+line);
                newInput = line;
                netbr.readLine() = null
                repaint();
            }


Jeg er ikke så god til java, men man skal ikke gøre sådan ^ vel?
Avatar billede _carsten Nybegynder
13. april 2006 - 12:11 #15
Nej det skal du skal ikke, prøver lige pt at lave et eksempel med en tråd, men kan bare ikke få det til at fungere - det er din BufferedReader som låser.
Avatar billede mikze Nybegynder
13. april 2006 - 12:29 #16
Okay! Skriv endelig hvis du finder ud af noget.
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