kostenloser Webspace werbefrei: lima-city


Datentransferproblem

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    c****s

    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)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. Autor dieses Themas

    c****s

    Vielen Dank, ich hatte den Thread schon aufgegeben.

    Ich werde mir das alles nächste Woche mal im Detail anschauen, ausprobieren und bewerten. Vielen Dank für deine Arbeit und den Aufwand, den du da reingesteckt hast. *two thumbs up*
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!