Avatar billede tri Nybegynder
10. juni 2002 - 19:25 Der er 34 kommentarer og
1 løsning

Tvinge browseren til at opdatere?

Efter at have læse gamle spørgsmål, har jeg fået det opfattelse at man fra serveren kan tvinge en browser til at opdaterer sig, vha. en applet.

Jeg kunne godt tænke mig et mini eksempel på hvordan det løses i praksis.
Avatar billede snowflake7 Nybegynder
10. juni 2002 - 21:22 #1
Du kan tvinge browseren til at opdatere/geninedlæse en side ved at skrive dette tag i JSP side:

<META HTTP-EQUIV="Refresh" Content = "30; URL=DinJSPURLHer.jsp">
30 er den tid i sekunder det tager før siden bliver opdateret.
Håber du kan bruge det til noget ellers spørg efter disky eller soelvpil!
Avatar billede tri Nybegynder
10. juni 2002 - 21:30 #2
d00d7-35:

Det kan desværre ikke bruges, da browseren konstant vil blive opdateret.

Jeg vil kun opdater den, når der sker ændringer på serveren!
Avatar billede tri Nybegynder
10. juni 2002 - 21:33 #3
Det jeg har brug for er hvordan Appletten skal se ud, og hvordan den kaldes fra serveren.
Avatar billede disky Nybegynder
10. juni 2002 - 21:35 #4
du laver en applet, som lytter paa en bestemt port, hvis serveren synes siden skal opdateres sender den en besked på denne port.

Du bruger så:
getAppletContext().showDocument(url,"_blank");

Hvor url er den URL du vil hente.
Avatar billede tri Nybegynder
10. juni 2002 - 23:49 #5
disky:

jeg har aldrig arb. med appletter før, så jeg skal nok bruge lidt mere hjælp.

Jeg har lavet denne applet:
import java.applet.*;
import java.awt.*;
import java.net.*;

public class UpdateApplet extends Applet {
  public void init() {

      try {
        getAppletContext().showDocument
          (new URL(getCodeBase()+"test.jsp"));
        }
      catch (Exception ex) {}

  }
}

Du skriver jeg skal sætte den til at lytte på en bestemt port, hvordan gør jeg det?
Og hvordan sender jeg en besked på netop denne port?
Avatar billede tri Nybegynder
11. juni 2002 - 19:25 #6
disky, kan du hjælpe mig lidt?
Avatar billede disky Nybegynder
11. juni 2002 - 19:44 #7
skal jeg nok, skal lige havde gravet min bærbar frem
Avatar billede tri Nybegynder
13. juni 2002 - 18:30 #8
disky, har du fundet din bærbar :-)
Avatar billede disky Nybegynder
13. juni 2002 - 19:34 #9
ja, men glemt det her, sorry

be back later
Avatar billede tri Nybegynder
18. juni 2002 - 20:00 #10
disky:
I need help :-)
Avatar billede disky Nybegynder
18. juni 2002 - 23:07 #11
ups nu begynder det at blive flovt,

jeg finder det nu
Avatar billede disky Nybegynder
18. juni 2002 - 23:12 #12
/*
* Receiver.java
*
* Created on 22. september 2001, 12:01
*/

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

/**
*
* @author  ecuser
* @version
*/
public class Receiver extends java.lang.Object
{
    private static final int portNumber=1234;
   
    private ServerSocket socket;
   
        /** Creates new Receiver */
    public Receiver()
    {
        try
        {
            socket=new ServerSocket(portNumber);
        }
        catch (IOException e)
        {
            e.printStackTrace(System.out);
        }
    }
   
    public void listen()
    {
        Socket sock=null;
       
        try
        {
            System.out.println("Start to listen");
            sock=socket.accept();
            System.out.println("Connection accepted");
           
            BufferedInputStream in=new BufferedInputStream(sock.getInputStream());
           
            int data;
            char chx;
           
            try
            {
                while( (data=in.read())!=-1)
                {
                    chx=(char)data;
                    System.out.print(chx);
                }
            }
            catch (SocketException e)
            {
                //e.printStackTrace(System.out);
                System.out.println("Message = "+e.getMessage());
            }

            if(sock!=null)
            {
                sock.close();
                System.out.println("Socket connection has been closed");
            }
        }
        catch (IOException e)
        {
            e.printStackTrace(System.out);
        }
    }
}


Denne klasse lytter på en forbindelse på en bestemt port, det skal du så bygge ind i din applet

Skal du også have sender delen ?
Så må jeg lige lave den imorgen.
Avatar billede tri Nybegynder
19. juni 2002 - 00:25 #13
Sender delen også, ja tak, det ville være helt perfekt.
Avatar billede disky Nybegynder
19. juni 2002 - 10:29 #14
Her kommer resten:

/*
* AppletCom.java
*
* Created on 19. juni 2002, 09:58
*/

/**
*
* @author  Reinke
* @version
*/
public class AppletCom
{
   
    /** Creates new AppletCom */
    public AppletCom()
    {
    }
   
    /**
    * @param args the command line arguments
    */
    public static void main(String args[])
    {
        if(args[0].equals("send"))
        {
            Sender sender=new Sender();
            sender.send("Hej med dig");
        }
        else if(args[0].equals("receive"))
        {
            Receiver receiver=new Receiver();
            receiver.listen();
        }
    }
   
}





/*
* Sender.java
*
* Created on 19. juni 2002, 10:12
*/

/**
*
* @author  reinke
* @version
*/

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

public class Sender
{
    private static final int portNumber=1234;

    /** Creates new Sender */
    public Sender()
    {
    }
   
    public void send(String text)
    {
        try
        {
        Socket sock=new Socket("localhost",portNumber);
        DataOutputStream out=(new DataOutputStream(sock.getOutputStream()));
        out.writeBytes(text);
        out.close();
        sock.close();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
   
}




du tester ved at åbne to forskellige commando prompts.
i den ene skriv

java -cp . AppletCom receive

i den anden

java -cp . AppletCom send

Så skulle du gerne se en reaktion
Avatar billede tri Nybegynder
20. juni 2002 - 21:01 #15
disky:

Jeg har rodet lidt kode samme til en applet, som jeg mener skulle lytte på port 7913, og opdaterer browseren, hvis der bliver sende noget tekst på porten.

Men når jeg prøver at sende noget på porten, så kommer denne fejl:
java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:350)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:137)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:124)
    at java.net.Socket.<init>(Socket.java:268)
    at java.net.Socket.<init>(Socket.java:95)
    at Sender.send(Sender.java:26)
    at Sender.main(Sender.java:42)


Appletten se således ud:

import java.applet.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

public class UpdateApplet extends Applet {


public class Receiver {

private static final int portNumber = 7913;
private ServerSocket socket;
private char chx = 0;

        /** Creates new Receiver */
        public Receiver() {
            try {
                socket = new ServerSocket(portNumber);
            }

            catch (IOException e) {
                e.printStackTrace(System.out);
            }
        }

        public void listen() {

            Socket sock = null;

            try {

            System.out.println("Start to listen");
            sock=socket.accept();
            System.out.println("Connection accepted");

            BufferedInputStream in=new BufferedInputStream(sock.getInputStream());

            int data;

        //    char chx;

            try
            {
                while( (data=in.read())!=-1)
                {
                    chx=(char)data;
                    System.out.print(chx);

                }
            }
            catch (SocketException e)
            {
                //e.printStackTrace(System.out);
                System.out.println("Message = "+e.getMessage());
            }




                if (chx != 0) {

                    try {

                        URL url = new URL("http://www.dr.dk");
                        getAppletContext().showDocument(url,"_blank");
                          }

                    catch (Exception ex) {}

                }






            if(sock!=null)
            {
                sock.close();
                System.out.println("Socket connection has been closed");
            }
        }
        catch (IOException e)
        {
            e.printStackTrace(System.out);
        }






    }
}

}





Jeg sender noget tekst på porten via din klasse:
public class AppletCom {


        /** Creates new AppletCom */
        public AppletCom()
        {
        }

        /**
        * @param args the command line arguments
        */
        public static void main(String args[])
        {
            if(args[0].equals("send"))
            {
                Sender sender=new Sender();
                sender.send("Hej med dig");
            }

    /*
            else if(args[0].equals("receive"))
            {
                Receiver receiver=new Receiver();
                receiver.listen();
            }
    */


    }


}



Jeg har prøvet at køre 2 * AppletCom med de 2 argumenter, og det virker også fint.
Problemmet opstår når jeg kun sender på porten.
(og lytter fra appleten)

Nogen ideer?
Avatar billede disky Nybegynder
20. juni 2002 - 22:57 #16
du skal ikke have receiver som en inner class i din applet.

jeg kan prøve at kigge på det imorgen, post lige igen, så jeg opdager det imorgen :))
Avatar billede tri Nybegynder
21. juni 2002 - 08:56 #17
Disky:

Jeg har lavet lidt om i appleten, og nu virker den nogenlunde.

jeg har lagt koden i public void init() {}, er det måden at gøre det?

Når jeg går ind på appleten i browseren , så er det som om at siden aldrig loader helt færdig.
(Det kan ses på statuslinjen) Skal den det?

Og jeg vil jo gerne have apletten til altid at stå og lytte, så jeg har lavet denne while: while (0 < 1) {}. Er det den korrekte måde?


import java.applet.Applet;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.URL;

public class UpdateApplet extends Applet {
    private static final int portNumber = 7913;
    private ServerSocket socket;
    private char chx = 0;

    public void init() {


    while (0 < 1) {

            try {
                socket = new ServerSocket(portNumber);
            }

                catch (IOException e) {
                    e.printStackTrace(System.out);
                }

                    Socket sock = null;


            try {
                System.out.println("Start to listen");
                sock = socket.accept();
                System.out.println("Connection accepted");
                BufferedInputStream in = new BufferedInputStream(sock.getInputStream());
                int data;

                //    char chx;

                            try {

                                    while ((data = in.read()) != -1) {
                                        chx = (char) data;
                                        System.out.print(chx);
                                    } //end-while

                            } //end-try

                                catch (SocketException e) {
                                    System.out.println("Message = " + e.getMessage());
                                }

                        if (chx != 0) {
                            try {
                                URL url = new URL("http://www.dr.dk");
                                getAppletContext().showDocument(url, "_blank");
                            }
                                catch (Exception ex) {
                                }

                        } //end-if


                        //if(sock!=null)
                        //{
                        //    sock.close();
                        //    System.out.println("Socket connection has been closed");
                        //}

                } //end try

                                catch (IOException e) {
                                    e.printStackTrace(System.out);
                                }
        } //while
    } //init
} //applet
Avatar billede disky Nybegynder
21. juni 2002 - 09:10 #18
grunden til den aldrig bliver færdig er fordi den aldrig kommer ud af init() pga dine while()

Din init() skal starte en tråd som så snakker med serveren igennem min tidligere klasse.
Avatar billede tri Nybegynder
21. juni 2002 - 09:30 #19
ok. Er det noget ligende sådan du mener?

public class UpdateApplet extends Applet implements Runnable
{
   

    public void init() {

    Receiver r = new Receiver();
    Thread t = new Thread(r);
    t.start();


    }
}
Avatar billede disky Nybegynder
21. juni 2002 - 13:04 #20
forudsat Receiver extender thread og den har en run() metode så ja

Kald listen() fra din run()

Så skulle det virker


p.s. Er det ikke meget federe at lave tingene selv og kun få hints ? :-)
Avatar billede tri Nybegynder
21. juni 2002 - 13:57 #21
jo det er nu det sjoveste at lave det selv, men det er desværre ikke alt man selv kan finde ud af. endnu da :-)


Nu ser Receiveren sådan ud:

import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.URL;

public class Receiver extends Thread  {
    private static final int portNumber = 7913;
    private ServerSocket socket;



    /** Creates new Receiver */
    public Receiver() {
        try {
            socket = new ServerSocket(portNumber);
        }

        catch (IOException e) {
            e.printStackTrace(System.out);
        }
    }

    public void run () {

        listen();
    }


    public void listen() {

        Socket sock = null;

        try {

            System.out.println("Start to listen");
            sock = socket.accept();
            System.out.println("Connection accepted");
            BufferedInputStream in = new BufferedInputStream(sock.getInputStream());
            int data;
            char chx;

                    try {

                            while ((data = in.read()) != -1) {
                                chx = (char) data;
                                System.out.print(chx);
                            }

                    }


                    catch (SocketException e) {
                        //e.printStackTrace(System.out);
                        System.out.println("Message = " + e.getMessage());
                    }


                if (sock != null) {
                    sock.close();
                    System.out.println("Socket connection has been closed");
                }

        }

        catch (IOException e) {
            e.printStackTrace(System.out);
        }



    }
}




Men hvordan skal jeg implementerer dette:

try {
                                URL url = new URL("http://www.dr.dk");
                                getAppletContext().showDocument(url, "_blank");
                            }
                                catch (Exception ex) {
                                }

i appleten?
Avatar billede disky Nybegynder
21. juni 2002 - 14:15 #22
inde i


                    try {

                            while ((data = in.read()) != -1) {
                                chx = (char) data;
                                System.out.print(chx);
                            }

                    }


Hente du de data du modtager, hvis du så får noget data der siger den skal opdatere siden, kalde du det try{} kode du lige har postet.

p.s.
Bare roligt du er rigtigt godt på vej til at lære det !
Avatar billede disky Nybegynder
21. juni 2002 - 14:16 #23
hov ret lige
    public void run () {

        listen();
    }

til
    public void run ()
    {
      while(true)
      {
        listen();
      }
    }

så den lytter mere end 1 gang
Avatar billede tri Nybegynder
21. juni 2002 - 14:36 #24
jamen getAppletContext() kendes kun hvis Reciver extender fra Applet, og det gør den jo ikke. Den extender Threads!
(man kan jo ikke extende fra 2)!
Avatar billede delwin Nybegynder
21. juni 2002 - 14:38 #25
jeg tror jeg ville bede min applet om at kalde et script der skrev tidspunktet ud for sidste ændring i en bestemt fil.. og så gemte det tidspunkt i en variabel.. så skulle apletten så kigge en gang imellem og se om der var kommet en nyere version.. burde ikke være så indviklet..
Avatar billede disky Nybegynder
21. juni 2002 - 16:16 #26
så extender du applet og implementer runnable :-)

delwin:problemmet med din ide er at så skal du konstant spørge serveren
Avatar billede delwin Nybegynder
21. juni 2002 - 18:38 #27
disky.. ja.. men at spørge en server om et tal på 10-12 cifre en gang hver 30 sekunder er heller ikke ligefrem noget der belaster den voldsomt..
Avatar billede tri Nybegynder
24. juni 2002 - 14:20 #28
disky:

Jeg har stadig et lille problem.
Appleten lytter fint, men når jeg sender data ud på porten, så kommer denne fejl på appletten:
Start to listen

Connection accepted

java.lang.NullPointerException

    at java.applet.Applet.getAppletContext(Unknown Source)

    at Receiver.listen(Receiver.java:75)

    at Receiver.run(Receiver.java:48)

    at java.lang.Thread.run(Unknown Source)




Her er receiveren:


import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.URL;
import java.applet.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.applet.Applet;
import java.net.URL;




public class Receiver extends Applet implements Runnable {
    private static final int portNumber = 7913;
    private ServerSocket socket;

    /** Creates new Receiver */
    public Receiver() {
        try {
            socket = new ServerSocket(portNumber);
        }

        catch (IOException e) {
            e.printStackTrace(System.out);
        }
    }

    public void run ()
      {
        while(true)
        {
          listen();
        }
      }


    public void listen() {

        Socket sock = null;

        try {

            System.out.println("Start to listen");
            sock = socket.accept();
            System.out.println("Connection accepted");
            BufferedInputStream in = new BufferedInputStream(sock.getInputStream());
            int data;
            char chx;

                    try {

                            while ((data = in.read()) != -1) {
                                chx = (char) data;
                                System.out.print(chx);
                            }


                                            URL url = new URL("http://www.dr.dk");
                                            getAppletContext().showDocument(url, "_blank");

                    }




                    catch (SocketException e) {
                        //e.printStackTrace(System.out);
                        System.out.println("Message = " + e.getMessage());
                    }


                if (sock != null) {
                    sock.close();
                    System.out.println("Socket connection has been closed");
                }

        }

        catch (IOException e) {
            e.printStackTrace(System.out);
        }



    }
}




Og updateApletten:


import java.applet.Applet;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.URL;

public class UpdateApplet extends Applet
{

      public void init() {

    Receiver r = new Receiver();
    Thread t = new Thread(r);
    t.start();

    }

}



Hvad kan det være?
Avatar billede tri Nybegynder
24. juni 2002 - 14:22 #29
Det er nogen med "getAppletContext"

men det mærkelige er at dette kode virker perfekt:

import java.applet.Applet;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.URL;

public class UpdateApplet extends Applet
{

      public void init() {

//    Receiver r = new Receiver();
//    Thread t = new Thread(r);
//    t.start();



            try {
                URL url = new URL("http://www.dr.dk");
                getAppletContext().showDocument(url, "_blank");
            }

            catch (Exception e) {
                        //e.printStackTrace(System.out);
                        System.out.println("Message = " + e.getMessage());
                    }


    }

}
Avatar billede tri Nybegynder
25. juni 2002 - 15:47 #30
disky:

Har du tid til at afprøve eksemplet jeg postede 24/06-2002 14:20:40
Jeg kan nemlig ikke få det til at virke helt
Avatar billede tri Nybegynder
04. juli 2002 - 23:10 #31
Disky:

Du får pointene for sin store hjælp.
Men jeg har stadig ikke fået det til at virke med tråden.

Appletten lytter fint, men der bliver ikke åbnet en ny URL når jeg sender noget ud på porten.

se her:

******UpdateApplet*******

import java.applet.Applet;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.URL;

public class UpdateApplet extends Applet
{

      public void init() {

    Receiver r = new Receiver();
    Thread t = new Thread(r);
    t.start();

    }

}




*****Receiver********


import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.URL;
import java.applet.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.applet.Applet;
import java.net.URL;




public class Receiver extends Applet implements Runnable {
    private static final int portNumber = 7913;
    private ServerSocket socket;

    /** Creates new Receiver */
    public Receiver() {
        try {
            socket = new ServerSocket(portNumber);
        }

        catch (IOException e) {
            e.printStackTrace(System.out);
        }
    }

    public void run ()
      {
        while(true)
        {
          listen();
        }
      }


    public void listen() {

        Socket sock = null;

        try {

            System.out.println("Start to listen");
            sock = socket.accept();
            System.out.println("Connection accepted");
            BufferedInputStream in = new BufferedInputStream(sock.getInputStream());
            int data;
            char chx;

                    try {

                            while ((data = in.read()) != -1) {
                                chx = (char) data;
                                System.out.print(chx);
                            }


                                            URL url = new URL("http://www.dr.dk");
                                            getAppletContext().showDocument(url, "_blank");

                    }




                    catch (SocketException e) {
                        //e.printStackTrace(System.out);
                        System.out.println("Message = " + e.getMessage());
                    }


                if (sock != null) {
                    sock.close();
                    System.out.println("Socket connection has been closed");
                }

        }

        catch (IOException e) {
            e.printStackTrace(System.out);
        }
    }
}


Appletten skriver dette:

Start to listen

Connection accepted

java.lang.NullPointerException

    at java.applet.Applet.getAppletContext(Unknown Source)

    at juul.applet.Receiver.listen(Receiver.java:73)

    at juul.applet.Receiver.run(Receiver.java:46)

    at java.lang.Thread.run(Unknown Source)
Avatar billede disky Nybegynder
05. juli 2002 - 01:40 #32
mange tak.

Post lige et svar her, så kigger jeg på det imorgen
Avatar billede tri Nybegynder
05. juli 2002 - 08:40 #33
Godmorgen.

Her er svaret så.
Avatar billede tri Nybegynder
05. juli 2002 - 13:22 #34
Disky:

Det mærkelige er at dette virker fint:

import java.applet.Applet;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.URL;

public class UpdateApplet extends Applet
{

      public void init() {

    Receiver r = new Receiver();
    Thread t = new Thread(r);
    t.start();

   

            try {
                URL url = new URL("http://www.dr.dk");
                getAppletContext().showDocument(url, "_blank");
            }

            catch (Exception e) {
                        //e.printStackTrace(System.out);
                        System.out.println("Message = " + e.getMessage());
                    }
   


    }

}


Men når jeg bruger tråden, så virker det ikke!!
Avatar billede disky Nybegynder
08. juli 2002 - 10:25 #35
Hej Tri

Undskyld jeg endnu en gang glemte det.

Kan du ikke sende sourcekode til disky@hotmail.com så kigger jeg på det, hurtigst muligt.
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