Dateien versenden Java
lima-city → Forum → Programmiersprachen → Java
brauch
code
datei
empfangen
endung
erstellen
fehler
file
frage
host
import
null
objekt
port
server
string
system
test
verschicken
versenden
-
Hallo, ich möchte über das Netzwerk eine Datei versenden. Die Fehlermeldung lautet:
Error: Die Engine hat einen Fehler beim Öffnen des InputStreams verursacht.
Exception in thread \"main\" java.lang.NullPointerException
at lib.net.TestClient.main(TestClient.java:13)
Hier ist der Code:
package lib.net; import lib.messages.Error; import java.net.ServerSocket; import java.net.Socket; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.IOException; public class TCPServer { protected int port; protected ServerSocket server; public TCPServer( int port ) { this.port = port; try { server = new ServerSocket( port ); } catch( IOException ioex ) { Error.throwError( \"Die Engine hat einen Fehler beim Öffnen des Servers verursacht.\" ); } } public void sendFile( File f, Socket client ) { try { OutputStream os = client.getOutputStream(); ObjectOutputStream oos = new ObjectOutputStream( os ); oos.writeObject( f ); oos.close(); os.close(); } catch( IOException ioex ) { Error.throwError( \"Die Engine hat einen Fehler beim Versenden des Objekts gemacht.\" ); } } public File getFile( Socket client ) { try { InputStream is = client.getInputStream(); ObjectInputStream ois = new ObjectInputStream( is ); File f = (File)ois.readObject(); ois.close(); is.close(); return f; } catch( ClassNotFoundException cnfex ) { Error.throwError( \"Die Engine hat einen Fehler beim Empfangen des Objects verursacht.\" ); return null; } catch( IOException ioex ) { Error.throwError( \"Die Engine hat einen Fehler beim Warten auf Clients verursacht.\" ); return null; } } public ServerSocket getServer() { return server; } public int getPort() { return port; } } package lib.net; import lib.messages.Error; import java.net.Socket; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; public class TCPClient { protected String host; protected int port; protected Socket server; public TCPClient( String host, int port ) { this.host = host; this.port = port; try { server = new Socket( host, port ); } catch( IOException ioex ) { Error.throwError( \"Die Engine konnte keine Verbindung zum Server aufbauen\" ); } } public void sendFile( File f ) { try { OutputStream os = server.getOutputStream(); ObjectOutputStream oos = new ObjectOutputStream( os ); oos.writeObject( f ); oos.close(); os.close(); } catch( IOException ioex ) { Error.throwError( \"Die Engine hat einen Fehler beim Versenden des Objekts gemacht.\" ); } } public File getFile() { try { InputStream is = server.getInputStream(); ObjectInputStream ois = new ObjectInputStream( is ); File f = (File)ois.readObject(); ois.close(); is.close(); return f; } catch( ClassNotFoundException cnfex ) { Error.throwError( \"Die Engine hat einen Fehler beim Empfangen des Objects verursacht.\" ); return null; } catch( IOException ioex ) { Error.throwError( \"Die Engine hat einen Fehler beim Öffnen des InputStreams verursacht.\" ); return null; } } public Socket getServer() { return server; } public String getHost() { return host; } public int getPort() { return port; } } package lib.net; import java.net.Socket; import java.io.IOException; import java.io.File; public class TestServer { public static void main(String[] args) throws IOException { TCPServer server = new TCPServer( 6010 ); while( true ) { Socket client = server.getServer().accept(); File f = server.getFile( client ); server.sendFile( f, client ); client.close(); } } } package lib.net; import java.io.IOException; import java.io.File; public class TestClient { public static void main( String[] args ) throws IOException { File f = new File( \"file://J:/Dokumente und Einstellungen/****/Desktop/WS_FTP.LOG\" ); TCPClient client = new TCPClient( \"localhost\", 6010 ); client.sendFile( f ); File f1 = client.getFile(); System.out.println( f1.toString() ); } }
Beitrag geändert: 24.3.2008 19:10:33 von test-server -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Vielleicht solltest du den Code mal irgendwo anders(stichwort: nopaste) hochladen oder ihn wenigstens in die code-tags setzen. Uneingerückt ist er grausam zu lesen.
Und dann könntest du evntl. noch die Zeile markieren, die die Exception wirft. -
Problem gelöst! Irgendwo habe ich die Streams und damit auch den Socket geschlosse.
Beitrag geändert: 25.3.2008 0:17:09 von test-server -
Ich denke einfach, dass du dein File-Object bei einem ObjectOutputStream ja serialisiertst, es also in irgendeiner Form abspeicherst. \"Verschoben\" wird es natürlich nicht. Aber sich den Dateiinhalt zu holen/später wieder ausgeben zu lassen sollte nicht sooo schwer sein, oder?
-
Ich habe ein Objekt File f. Das möchte ich abspeichern. Bitte sag mir wie! Unter einem beliebigem Namen!
-
Evntl. würde ich einfach den Code der Datei auslesen und den wegschicken:
RandomAccessFile raf = new RandomAccessFile(new File(\"a.txt\"), \"r\"); StringBuilder src = new StringBuilder(); for(String line; (line = raf.readLine()) != null;) src.append(line+System.getProperty(\"line.separator\"));
Dann eben ein neues File erstellen und den gegebenen Code da rein schreiben. -
na herzlichen glückwunsch du torfnase :-)
dann hab ich hab kein File, sondern ein String gesendet, und das sehr unkomfortabel. Ich hab mir überlegt, dass ich sowas verschicke:
class PackageString implements Serializable { String filename; String filecontent; }
// Edit: nur sind meines wissens nach nicht alle dateien stringdateien, d.h. ich brauch ne zweite klasse mit bytearray
class PackageBytes implements Serializable { String filename; byte[] filecontent; }
Aber wie unterscheide ich, wann ich was brauch? Allein nach der Endung wie *.txt oder *.mp3 geht ja nicht...
Beitrag geändert: 25.3.2008 0:52:20 von test-server -
Hab mir mehrere Pakete erstellt. Auch einen Manager, der die serialisiert, verschickt bzw. empfängt und deserialisiert. Damit kann ich alles ressourcensparend verschicken. Habe heute morgen schon fröhlich ein paar Audiodateien über einen selbst erstellen Echoserver verschickt. Sehr spaßig^^
-
... kann ich das Thema damit als abgeschlossen betrachten oder kommt noch was?
*lieber mal nachfragt* -
Kannst schließen^^
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage