Datentransferproblem
lima-city → Forum → Programmiersprachen → Java
aufwand
buffer
byte
code
datei
detail
file
final string
funktion
hilfreiche antwort
import
interface
machen
private byte
private string
schnittstelle
server
setzen
string
verzweifelt dateien
-
Ich versuche verzweifelt Dateien über EJBs auszutauschen. Hierzu habe ich mir folgende Klasse zur Serialisierung gebastelt:
package census.ejb; public class SerialFile implements java.io.Serializable { private byte [] buffer; private String name; public SerialFile () {} public void setBuffer (byte [] buffer) { this.buffer = buffer; } public byte [] getBuffer () { return buffer; } public void setName (String name) { this.name = name; } public String getName () { return name; } public String toString () { return name; } }
Auf dem Server läuft außerdem folgendes stateless Sessionbean, bei dem ich bis jetzt nur die Minimalimplementierung gemacht habe:
package census.ejb; import java.io.*; import javax.ejb.*; @Stateless (mappedName="ejb/FileManager") public class FileManagerBean implements FileManagerRemote { private static final String root = "/maitai/"; public long getSize (String name) { return new File (root + name).length (); } public long getSize (SerialFile file) { return new File (root + file.getName () ).length (); } public void download (SerialFile file) throws FileNotFoundException, IOException { InputStream is = new FileInputStream (root + file.getName () ); is.read (file.getBuffer () ); is.close (); } public void upload (SerialFile file) throws FileNotFoundException, IOException { OutputStream os = new FileOutputStream (root + file.getName () ); os.write (file.getBuffer () ); os.flush (); os.close(); } }
Und das ist meine Schnittstelle nach außen:
package census.ejb; import java.io.*; import javax.ejb.*; @Remote public interface FileManagerRemote { public long getSize (String name); public long getSize (SerialFile file); public void download (SerialFile file) throws IOException, FileNotFoundException; public void upload (SerialFile file) throws IOException, FileNotFoundException; }
Das Ganze teste ich hiermit:
import java.io.*; import census.ejb.*; import javax.naming.*; public class Main { public static FileManagerRemote mngr; public static void main (String [] _) throws Exception { InitialContext ic = new InitialContext (); mngr = (FileManagerRemote) ic.lookup ("ejb/FileManager"); testUpload (); testDownload (); } public static void testUpload () throws Exception { File localFile = new File ("/home/lorenzo/test"); SerialFile remoteFile = new SerialFile (); byte [] buffer = new byte [ (int) localFile.length () ]; remoteFile.setName ("uploaded"); remoteFile.setBuffer (buffer); InputStream is = new FileInputStream (localFile); is.read (remoteFile.getBuffer () ); is.close (); mngr.upload (remoteFile); } public static void testDownload () throws Exception { File localFile = new File ("/home/lorenzo/downloaded"); SerialFile remoteFile = new SerialFile (); byte [] buffer = new byte [ (int) mngr.getSize (remoteFile) ]; remoteFile.setName ("uploaded"); remoteFile.setBuffer (buffer); mngr.download (remoteFile); OutputStream os = new FileOutputStream (localFile); os.write (remoteFile.getBuffer () ); os.flush (); os.close (); } }
Der Upload funktionert wunderbar, der Download gar nicht!
Beim Upload wird die Datei im Zielverzeichnis auf dem Server angelegt und hat den selben Inhalt wie die Originaldatei. Beim Download wird zwar lokal die Datei angelegt, wird aber nur mit Nullen vollgeschrieben. Wenn ich allerdings die download-Routine auf dem Server debugge, steht im Buffer was sinnvolles drinnen. Anscheinend geht das bei der Serialisierung flöten.
Aber warum geht die Serialisierung in eine Richtung und in die andere nicht?
Oder liegt der Fehler ganz wo anders?
Ich danke euch für ne hilfreiche Antwort, denn ich kann mir das Ganze überhaupt nicht erklären.
(Konfig: Server: Glassfish v2, Client: java-6-sun-1.6.0_13, beide auf kernel 2.6.28-13) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hi,
dein Beitrag ist nun schon etwas älter, aber ich hoffe er ist noch akutell ;). Mich hat das Thema
interessiert und da kann man sich schon mal etwas Zeit nehmen, die habe ich dann aber auch
gebraucht.
Also beim upload übergibst du das File an den Server und der speichert - fertig.
Beim Download musst du dem Server sagen welches File du haben möchtest und
dann sendet der Server das File zum Client. (Mal plump ausgedrückt ohne RMI, Serialisierung und was weiß ich noch alles)
Ich sehe bei deinem Code 2 Probleme:
1.)public static void testDownload () throws Exception { File localFile = new File ("/home/lorenzo/downloaded"); SerialFile remoteFile = new SerialFile (); byte [] buffer = new byte [ (int) mngr.getSize (remoteFile) ]; remoteFile.setName ("uploaded"); remoteFile.setBuffer (buffer); mngr.download (remoteFile); OutputStream os = new FileOutputStream (localFile); os.write (remoteFile.getBuffer () ); os.flush (); os.close (); }
hier solltest du den Namen des remoteFile setzen, bevor du die Bufferlänge bestimmst.
2.) Die Funktion "download" sollte als Rückgabewert das herunterzuladende SerialFile haben. Als Parameter würde eigentlich ein String Filename reichen, aber mit einem SerialFile geht es natürlich auch. Aus dem zurückgegebenen File kannst du dann den Buffer in eine Datei schreiben und schon klappt der download :).
So wie du es versucht hast, gehst du von einer Paramterübergabe by reference aus, java macht aber immer by value und remote schon erst recht ;).
Hier mal die drei geänderten Klassen, welche bei mir unter Glassfish funktionieren (mit meinen Pfaden):
package census.ejb; import java.io.*; import javax.ejb.*; @Stateless (mappedName="ejb/FileManager") public class FileManagerBean implements FileManagerRemote { private static final String root = "c:/bea/maitai/"; public long getSize (String name) { return new File (root + name).length (); } public long getSize (SerialFile file) { return new File (root + file.getName () ).length (); } public SerialFile download (SerialFile file) throws FileNotFoundException, IOException { byte [] buffer = new byte [ (int) getSize (file)]; file.setBuffer (buffer); InputStream is = new FileInputStream (root + file.getName () ); is.read (file.getBuffer () ); is.close (); return file; } public void upload (SerialFile file) throws FileNotFoundException, IOException { OutputStream os = new FileOutputStream (root + file.getName () ); os.write (file.getBuffer () ); os.flush (); os.close(); } }
package census.ejb; import java.io.*; import javax.ejb.*; @Remote public interface FileManagerRemote { public long getSize (String name); public long getSize (SerialFile file); public SerialFile download (SerialFile file) throws IOException, FileNotFoundException; public void upload (SerialFile file) throws IOException, FileNotFoundException; }
package census.client; import java.io.*; import census.ejb.*; import javax.naming.*; public class Main { public static FileManagerRemote mngr; public static void main (String [] _) throws Exception { InitialContext ic = new InitialContext (); mngr = (FileManagerRemote) ic.lookup ("ejb/FileManager"); testUpload (); testDownload (); } public static void testUpload () throws Exception { File localFile = new File ("C:/bea/up/hallo.txt"); SerialFile remoteFile = new SerialFile (); byte [] buffer = new byte [ (int) localFile.length () ]; remoteFile.setName ("uploaded"); remoteFile.setBuffer (buffer); InputStream is = new FileInputStream (localFile); is.read (remoteFile.getBuffer () ); is.close (); mngr.upload (remoteFile); } public static void testDownload () throws Exception { File localFile = new File ("C:/bea/down/hallo.txt"); SerialFile remoteFile = new SerialFile (); remoteFile.setName ("uploaded"); System.out.println("laenge: " + mngr.getSize (remoteFile)); SerialFile retFile = mngr.download (remoteFile); FileOutputStream os = new FileOutputStream (localFile); os.write (retFile.getBuffer()); os.flush (); os.close (); } }
Ich hoffe du kannst was damit anfangen.
Gruß
Manni -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage