Avatar billede elv Nybegynder
23. juli 2001 - 14:56 Der er 31 kommentarer og
1 løsning

Datagramsockets i internet explorer

Jeg er ved at lave et projekt hvor jeg bruger datagramsockets til at overføre data mellem forskellige maskiner. Jeg har en servermaskine (lige nu er det min egen, derfor bruger jeg getLocalHost()) som der kører en server på. der kan så være forskellige klienter rundt omkring, der skal kunne skrive ind til serveren og i dette tilfælde bare få et svar tilbage.

Hvis jeg sætter serveren i gang og kører klienten i appletvieweren går alting godt - pakken bliver modtaget af serveren, sendt tilbage og modtaget af klienten - men i internet explorer kan klienten hverken sende eller modtage. Hvad går der galt?

Koden ser sådan her ud:
********* Client.java *********

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Client extends Applet implements ActionListener
{
  InetAddress serverIp;
  TextArea display;
  TextField input;
  DatagramPacket sendPacket, receivePacket;
  DatagramSocket socket;

  public void init()
  {
    input = new TextField(20);
    display = new TextArea(20, 20);
    add(input, BorderLayout.NORTH);
    add(display, BorderLayout.SOUTH);
    input.addActionListener(this);
    try {
      socket = new DatagramSocket();
      serverIp = InetAddress.getLocalHost();
//      serverIp = InetAddress.getByName(\"127.0.0.1\");
    }
    catch(SocketException se)  {
      show(\"SocketException:\"+se);
    }
    catch (UnknownHostException ue)  {
      show(\"UnknownHostException:\"+ue);
    }
    ClientListenThread l = new ClientListenThread(this);
    l.start();
  }

  public synchronized void show(String s)
  {
    display.append(s+\"\\n\");
    display.setCaretPosition(display.getText().length());
  }

  public void actionPerformed(ActionEvent e)
  {
    if (e.getSource().equals(input))
      send(input.getText());
  }

  public void send(String s)
  {
    show(\"Sender:\"+s);
    try
    {
      byte data[] = s.getBytes();
      sendPacket = new DatagramPacket(data, data.length, serverIp, 5000);
      socket.send(sendPacket);
    }
    catch (IOException ie)
    {
      show(ie.toString());
    }
    show(\"pakke sendt\");
  }
}


class ClientListenThread extends Thread
{
  Client c;
  DatagramPacket receivePacket;

  public ClientListenThread(Client _c)
  {
    c = _c;
  }

  public void run()
  {
    c.show(\"run\");
    while (true)
    {
      byte data[] = new byte[100];
      receivePacket = new DatagramPacket(data, data.length);
      c.show(\"Venter på ny besked\");
      try
      {
        c.socket.receive(receivePacket);
      }
      catch (IOException e)
      {
        c.show(\"IOException=\"+e.toString());
      }
      String s = new String(receivePacket.getData(), 0, receivePacket.getLength());
      c.show(\"Besked modtaget:\"+s);
    }
  }
}




********* Server.java *********







import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;

public class Server extends Frame
{
  public TextArea display;
  public DatagramPacket sendPacket, receivePacket;
  public DatagramSocket socket;

  public Server()
  {
    super(\"Server\");
    display = new TextArea();
    add(display, BorderLayout.CENTER);
    try {
      socket = new DatagramSocket(5000); //Lav en socket!
    }
    catch(SocketException se) {
      show(se.toString());
    }
    setSize(350, 500);
    show();
  }

  public void show(String s)
  {
    display.append(s + \"\\n\");
    display.setCaretPosition(display.getText().length());
  }

  public void send(DatagramPacket p)
  {
    try {
      socket.send(p);
    }
    catch (IOException ie) {
      show(\"Error!!! IO-exception=\"+ie);
    }
  }

  public void procesPacket(DatagramPacket receivePacket)
  {
    String data = new String(receivePacket.getData());
    show(\"Ny pakke.\");
    show(\"Data = \" + data);
    show(\"ip = \" + receivePacket.getAddress());
    show(\"port = \" + receivePacket.getPort());
    sendPacket = new DatagramPacket(data.getBytes(), data.length(), receivePacket.getAddress(), receivePacket.getPort());
    send(sendPacket);
  }

  public void startModtagning()
  {
    ServerListenThread l = new ServerListenThread(this);
    l.start();
  }

  public static void main(String args[])
  {
    Server app = new Server();

    app.addWindowListener(
      new WindowAdapter() {
        public void windowClosing(WindowEvent e)
        {
          System.exit(0);
        }
      }
    );
    app.startModtagning();
  }
}

class ServerListenThread extends Thread
{
  Server s;
  public ServerListenThread(Server server)
  {
    s = server;
  }
  public void run()
  {
    while (true)
    {
      try
      {
        s.show(\"Venter på pakker...\");
        byte data[] = new byte[100];
        s.receivePacket = new DatagramPacket(data, data.length);
        s.socket.receive(s.receivePacket);
        s.procesPacket(s.receivePacket);
      }
      catch(IOException io)
      {
        s.show(io.toString());
      }
    }
  }
}

MVH Elv
Avatar billede lbhansen Nybegynder
23. juli 2001 - 15:14 #1
For at kunne bruge din Applet, der connecter til andre maskiner, så skal du signe den
http://java.sun.com/products/plugin/1.1.2/docs/signed.html

Hvis du kigger i din IE konsol, så får du sikkert en Security Exception
Avatar billede elv Nybegynder
23. juli 2001 - 15:29 #2
Hvis du med IE konsol mener statuslinien, så får jeg ingen fejl.
Avatar billede elv Nybegynder
23. juli 2001 - 15:31 #3
...og indtil videre connecter den jo kun til min egen maskine...
Avatar billede lbhansen Nybegynder
23. juli 2001 - 15:40 #4
du har mulighed for at se en java konsol, det skal konfigureres i din browser.

Du connecter jo ikke bare til din egen maskine, du
opretter også en server på din clients maskine, og
det for du ikke lige lov til
Avatar billede elv Nybegynder
23. juli 2001 - 15:45 #5
Hvordan sætter jeg konsollen op? Det har jeg tit haft brug for. Jeg bruger IE 5.5.

Serveren er en application. Klienten er en applet. Skal jeg så have signered appletten?
Avatar billede lbhansen Nybegynder
23. juli 2001 - 15:58 #6
tools/internet options/advanced

under Microsoft VM kan du markere, at du vil
have en java konsol
Avatar billede elv Nybegynder
23. juli 2001 - 16:02 #7
Prøver det lige. (Kræver genstart)
Avatar billede elv Nybegynder
23. juli 2001 - 16:21 #8
Du har ret. Men hvordan virker de med certificates? Er det noget jeg er nødt til at købe? Det link du sendte er lidt forvirrende... hvordan gør jeg?
Avatar billede lbhansen Nybegynder
23. juli 2001 - 17:03 #9
Jeg må indrømme, at jeg ikke lige selv har pillet ved det, og det lader til at der er nogle forskelligheder mellem hvordan jdk1.1 og jdk1.2 gør tingene, men der er med garanti nogen der har prøvet proceduren før:)
Avatar billede mickni33 Nybegynder
23. juli 2001 - 20:57 #10
Kan man overhovedet bruge IE når du laver server/client på samme maskine ?
Avatar billede mickni33 Nybegynder
23. juli 2001 - 21:10 #11
Kører du linux eller win
Avatar billede mickni33 Nybegynder
23. juli 2001 - 21:11 #12
Har lavet det samme projekt i C++ så der burde ikke være den store forskel det var dog under Linux .
Avatar billede elv Nybegynder
24. juli 2001 - 09:45 #13
Jeg kører win98. Jeg tror godt at både client og server kan køre på samme maskine, det burde da være ligemeget. Men jeg har også prøvet at sætte serveren op på en anden maskine og det ville den heller ikke. Er der virkelig ikke nogen der har prøvet at signe en applet?
Avatar billede mickni33 Nybegynder
24. juli 2001 - 16:10 #14
Jeg lavede projektet i Linux der var der ingen problemer. Men win 98 ved jeg ikke rigtigt. Man bruger det jo ikke til server, men har derimod en server af NT eller LINUX hvor så klienterne kan være win 98/95. Hvis du laver server på en anden maskine skal du huske at ændre IP og port nummer da 127.0.0.1 jo er rollback IP (eller hvad det nu hedder.)
I C++ skal ip og port nummer stå på både client og server siden.
Avatar billede mickni33 Nybegynder
24. juli 2001 - 16:22 #15
OK nu har jeg måske noget du kan kigge på.

http://www.spejderchat.dk/iehelp_dk.htm
Avatar billede elv Nybegynder
24. juli 2001 - 21:41 #16
Mit problem er, at jeg skal bruge en løsning hvor klienten IKKE skal sætte noget op, hverken downloade filer eller indstille sikkerhedsrisikoer. På www.spil.tv2.dk findes der f.eks. spil (applets) der kan kommunikere uden at instille noget. Jeg har set det samme mange andre steder. Hvordan kan det lade sig gøre?
Avatar billede lbhansen Nybegynder
24. juli 2001 - 21:46 #17
det er fordi den laver en socket tilbage til den server hvor den kom fra. Dette kan sagtens lade sig gøre, og så bruger man den samme socket til at kommunikere begge veje. Serveren sørger også for at sende frem og tilbage mellem flere klienter
Avatar billede elv Nybegynder
24. juli 2001 - 22:15 #18
Hvordan kan klienten lave en socket tilbage? Så skal den jo først have en packet fra serveren. Og den får den jo ikke bare uden videre. Jeg forstår ikke helt hvad du mener, kan du forklare det nærmere? Eventuelt med et kodeeksempel...

(Serveren i mit eksempel kan jo også håndtere flere klienter, der skal jo bare sendes svar til alle pakker på samme adresse.)
Avatar billede lbhansen Nybegynder
24. juli 2001 - 22:24 #19
Din server vil bestå i af en ServerSocket på en given port, og oprette en ny tråd for hver indkommen request.

Din applet vil når den initialisere lave en normal Socket tilbage, så har du en forbindelse,
hvor du både kan bruge InputStream og OutputStream til at kommunikere med.

Hvis en klient ønsker at kommunikere med en anden klient, så sker det gennem serveren
Avatar billede elv Nybegynder
24. juli 2001 - 22:30 #20
Kan man da godt lave en normal socket uden at få en SecurityException? Og er det nødvendigt at lave serveren om til at bruge ServerSockets? Og kan en sådan server godt holde til at der skal køre 200 forskellige brugere? Og har du et kodeeksempel?
Avatar billede lbhansen Nybegynder
24. juli 2001 - 22:35 #21
jeg har ikke et specifikt kode eksempel, men der er massere rundt omkring på nettet.
Alternativt, kunne det være en Servlet eller jsp der lå på din server, og så modtager den http requests fra dine klienter. Der er mange måder at løse problemstillingen på
Avatar billede elv Nybegynder
24. juli 2001 - 22:37 #22
men det kan ikke lade sig gøre med datagramsockets?
Avatar billede lbhansen Nybegynder
24. juli 2001 - 22:47 #23
nej, for i det øjeblik du laver en DatagramSocket,
så erklærer du også at du er villig til at modtage pakker fra andre kilder en den server du kommer fra, og appletten skal derfor signes.

Jeg har kigget en smule på at signe applets, har ikke rigtig fået det til at spille, og har heller ikke lige tid til det, men inde på www.java.sun.com ligger der en masse god information.
Avatar billede elv Nybegynder
24. juli 2001 - 22:50 #24
ok. jeg har også kigget på det, og man ER nødt til at rode på modtagercomputeren ELLER at købe er certifikat.

Takker for hjælpen
Avatar billede elv Nybegynder
24. juli 2001 - 22:54 #25
Forresten, til fremtidige læsere: der findes et eksempel om serversocket på:
http://www.vuse.vanderbilt.edu/~gainesdm/courses/cs283/Spring01/clientServer/
Avatar billede lbhansen Nybegynder
25. juli 2001 - 07:12 #26
Det er ikke nødvendigt at gøre noget ved din Applet, hvis du bruger en central server.

Jeg har brugt den MTEchoServer.java fra dit eksempel, og startet den på min maskine.
Jeg har lavet nogle ændringer i EchoClient.java, så det er en applet der connecter istedet.
Du kan se alt sammen her.
http://opencms.el-lal.dk/java/index.html
Avatar billede elv Nybegynder
25. juli 2001 - 13:39 #27
Jeg havde lavet noget i den stil, men jeg manglede lige et par ting...

Tak for hjælpen
Avatar billede elv Nybegynder
26. juli 2001 - 12:49 #28
Hmm... jeg kan ikke helt få det til at virke. Skal man have sat en web-server op på destinationen, eller er det nok bare at have programmet kørende?
Avatar billede lbhansen Nybegynder
26. juli 2001 - 13:02 #29
Din server skal have en ServerSocket der lytter på en port, ligesom MTEchoServer.
Avatar billede elv Nybegynder
26. juli 2001 - 13:37 #30
yesyes, jeg har styr over programmet, men den computer som serveren kører på, skal den have en web-server kørende?
Avatar billede lbhansen Nybegynder
26. juli 2001 - 13:41 #31
ja, hvis du forventer at andre maskiner skal have fat i din applet, så skal den.

Avatar billede elv Nybegynder
26. juli 2001 - 13:43 #32
oki doki, mange tak
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