PDA

View Full Version : [JAVA] datagram multicast socket


soundsgood
30-03-2010, 14:39
ciao ragazzi sto cercando di fare girare un socket su una applet di una pagina web

si tratta di socket datagram multicast, che permette la comunicazione tra dei riceventi e un mandante.

se faccio girare il socket ricevente su un main da prompt e lo stesso il mandante (da un altro prompt), la comunicazione avviene.

io voglio pero che il ricevente deve girare su una applet di una pagina web, ma quando faccio il comando da prompt "appletviewer index.html" mi da il seguente messaggio:

java.security.AccessControlException: access denied (java.net.SocketPermission 230.0.0.9 connect,accept,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkMulticast(SecurityManager.java:1188)
at java.net.MulticastSocket.joinGroup(MulticastSocket.java:269)
at ClassApplet.start(ClassApplet.java:35)
at sun.applet.AppletPanel.run(AppletPanel.java:464)
at java.lang.Thread.run(Thread.java:619)


vi posto il codice della applet:

// Java Document
import java.io.*;
import java.net.*;
import java.util.*;

import java.applet.Applet;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.URL;

import java.applet.*;
import java.awt.*;

public class ClassApplet extends Applet{


public void start() {

try {

MulticastSocket socket = new MulticastSocket(5009);


try {


super.start();
System.out.println("Eseguito public void start()");

InetAddress group = InetAddress.getByName("230.0.0.9");
System.out.println("Eseguito inet");

socket.joinGroup(group);

byte[] buf = new byte[255];
DatagramPacket packet;
System.out.println("datagram()");
packet = new DatagramPacket(buf, buf.length);

while(true) {
System.out.println("while");

System.out.println("Attesa dal server");
socket.receive(packet);
String received = new String(packet.getData());
String messaggio = received.substring(0,3);


System.out.println("Messaggio ricevuto dal server: " + messaggio + "a");
if(messaggio.equals("ref")) {
//System.out.println("ref");
}
}

} // end try interno

catch (Exception e) {

e.printStackTrace();
socket.close();

}

} // end try esterno

catch (IOException e) {

e.printStackTrace();


}


}

}

vi posto il codice della pagina index.html

<html>
<head>
<title>Applet PrimoApplet</title>
</head>
<body>

<applet code="ClassApplet.class" width=200 height=100>Il tuo browser è vecchio, cambialo!</APPLET>

</body>
</html>


perche non funziona?

*AGGIORNAMENTO: se tolgo dal codice della applet la riga "socket.joinGroup(group);" (che permette ad un ricevente di iscriversi ad un multicast) l'esecuzione del codice va avanti fino al while e resta in attesa, ma non riesce a ricevere dal mandante (che faccio partire su un altro prompt)

soundsgood
31-03-2010, 00:44
in pratica bisogna segnare l'applet per aumentarne i diritti ecc..

sto seguendo le istruzioni su http://www.mokabyte.it/1998/03/security_JDK12.htm

ma nelle ultime due cose da fare non ho ben capito cosa devo mettere al posto di "home_diffido" nel paragrafo gestione del policy:

grant signedBy "NickFido" {
permission java.io.FilePermission "*", "read";
permission java.io.FilePermission "/home_Diffido/*", "read,write";
};

e nel paragrafo Appletviewer

appletviewer -J-Djava.policy=/home_Diffido/DiffidoPolicy.txt http://www.fidohost.it/FidoApplet.html

PGI-Bis
31-03-2010, 12:33
Istruzioni fresche fresche insomma :D.

Firma il jar dell'applet con un certificato auto generato.

http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/development.html#signing

A quel punto l'applet partirà lasciando che sia l'utente a decidere se tirarsi la zappa sui piedi o no.