Witam
napisałem aplikację do wyszukiwania nagrań konsultantów z jednego z help desków
niestety zleceniodawca zażyczył sobie aby można było te nagrania odsłuchiwać z poziomu aplikacji.
napisałem metody do odsłuchiwania mp3 i wav natomiast problem pojawił się w momęcie gdy pliki są na serwerze a nie na lokalnej maszynie. chciałbym móc pobrać z serwera(Unixowy system CentOS) tych plików na lokalną maszynę. napisałem server w formie servletu gdyż musze mu jakoś wskazać o jaki plik i z jakiej lokalizacji mi chodzi oraz oczywiście klienta. Niby wszystko powinno chodzić elegancko serwer czeka na zapytanie ale po stronie klienta wyskakuje wyjątek:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: Download_Stub (no security manager: RMI class loader disabled)
Download_Stub to namiastka mojego serwera
Nie jestem sobie w stanie z tym poradzić ponieważ Java doc dość niejasno wyjaśnia ten wyjątek
niżej podaję kod źródłowy serwera,namiastki,klienta i wywołania wszystkiego w aplikacji.
aplikacje uruchamiam na windows xp a serwer stoi na unixie, oczywiscie na serwerze sa odpalane rmiregistry itp. inna zdalna metoda dziala bez zarzutów. bardzo bym prosił o jakieś naprowadzenie
SERWER:
import java.io.File.*;
import java.io.Reader.*;
import java.rmi.RemoteException;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
import java.net.*;
import java.io.*;
public class Download implements InterDownload {
int port=0;
String sciezka="";
public void Download(){}
public int Port(int a)throws RemoteException {
port=a;
return port;
}
public String Sciezka(String b)throws RemoteException {
sciezka=b;
return sciezka;
}
public void Start(int g) throws RemoteException {
try{
ServerSocket servsock = new ServerSocket(g);
while (true) {
System.out.println("Waiting...");
Socket sock = servsock.accept();
System.out.println("Accepted connection : " + sock);
// sendfile
File myFile = new File (sciezka);
byte [] mybytearray = new byte [(int)myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
OutputStream os = sock.getOutputStream();
System.out.println("Sending...");
os.write(mybytearray,0,mybytearray.length);
os.flush();
sock.close();}}catch(Exception e){
System.out.println(""+e);}
}
public static void main(String args[]) {
try {
Download o = new Download();
InterDownload stub = (InterDownload) UnicastRemoteObject.exportObject(o, 0);
// Bind the remote object's stub in the registry
Registry registry = LocateRegistry.getRegistry("192.168.1.252",1099);
registry.bind("InterDownload", stub);
System.out.println("ok");
o.Start(Integer.parseInt(args[0]));
} catch (Exception w) {
System.out.println("Server exception: " + w.toString());
}
}}
interface Namiastki:
import java.rmi.Remote;
import java.io.File.*;
import java.rmi.RemoteException;
import java.io.Reader.*;
public interface InterDownload extends Remote {
public void Download() throws RemoteException;
public void Start(int g) throws RemoteException;
public int Port(int a) throws RemoteException;
public String Sciezka(String b) throws RemoteException;
}
Klient:
import java.net.*;
import java.io.*;
public class FileClient{
public FileClient(){}
public void Download(String ip,int port,String scierzka) {
try{int filesize=3932168; // filesize temporary hardcoded
long start = System.currentTimeMillis();
int bytesRead;
int current = 0;
// localhost for testing
Socket sock = new Socket(ip,port);
System.out.println("Connecting...");
// receive file
byte [] mybytearray = new byte [filesize];
InputStream is = sock.getInputStream();
FileOutputStream fos = new FileOutputStream(scierzka);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
// thanks to A. C�diz for the bug fix
do {
bytesRead =
is.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
bos.flush();
long end = System.currentTimeMillis();
System.out.println(end-start);
bos.close();
sock.close();
}catch(Exception d){
System.out.println(""+d);
}
}}
Wywołanie:
private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {
try {
File fi = new File("config.mb");
FileReader input = new FileReader(fi);
BufferedReader reader2 = new BufferedReader(input);
String h = reader2.readLine();
reader2.readLine();
reader2.readLine();
String to = reader2.readLine();
reader2.readLine();
reader2.readLine();
reader2.readLine();
int port=Integer.parseInt(reader2.readLine());
String gdzie = to + jList1.getSelectedValue(); //gdzie ma byc pobrany na nasza lokalna maszyne
Registry registry = LocateRegistry.getRegistry(ip, 1099);
System.out.println("" + registry);
System.out.println(ip);
InterDownload dow= (InterDownload) registry.lookup("InterDownload");
System.out.println("" + g);
System.out.println("ok");
String wszystko="//"+ip+h+""+ jList1.getSelectedValue(); //scierzka z ip+plik jaki ma byc sciagniety
System.out.println(wszystko+"+"+port);
FileClient client=new FileClient();
dow.Port(port);
dow.Sciezka(wszystko);
client.Download(ip, port, gdzie);
long t0, t1;
t0 = System.currentTimeMillis();
do{System.out.println(""+1);
t1 = System.currentTimeMillis();
}
while ((t1 - t0) < (2 * 1000));
System.out.println("ok1");
System.out.println("ok2");
System.out.println("ok3");
} catch (Exception e) {
jDialog1.setVisible(true);
jTextPane2.setText("EXCEPTION: " + e);
}
}