Datei übertragen ja String + datei übertragen nein

java66

Aktives Mitglied
Hallo zusammen habe folgendes problem
ich verschicke ein file in einem netzwerk.
Cliend sendet datei zum server, server soll daraufhin eine meldung zurückgeben erhalten.

client->sende einen String an server
server->verarbeitet erhaltenen String vom client
client ->sende ein File
server->empfange File vom client
server->sende einen String an client

Nur die datei verschicken klappt bei mir ja aber einen String und danach das File das funktioniert nicht vileicht hat jemand mal kurz zeit und kann mal schauen was ich falsch mache
Danke euch.
Main des Clients
Java:
import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class ClientMain 
{
 public static void main(String[] args) 
 {
  File file = new File("c:/test3.txt");
  Client client = new Client("localhost", 4711,file);
  client.start.start();
 }
}

Client Klasse
Java:
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;


	public class Client implements Runnable {
		 
        String serverName;
        Thread start=new Thread(this);
        File file;
        int port;
        Socket socket;
        String fileName;
    	InputStream is=null;
    	OutputStream os=null;
        public Client(String serverName, int port, File file) 
        {
            this.serverName = serverName;
            this.port = port;
            this.file = file;
        }
 
        private void sendInformation(String FileName,String Type)
        {
        	try {
				DataOutputStream outstream=new DataOutputStream(socket.getOutputStream());
				outstream.writeUTF(FileName+","+Type);
				outstream.flush();
				outstream.close();
			} catch (IOException e) {
				System.out.println("Send Information Fehler");
				e.printStackTrace();
			}
        	
        }
        private void send(File file)
		{
        	if(socket==null)System.out.println("send(File) socket==null");

			try 
			{
				os = socket.getOutputStream();
			} catch (IOException e1) {System.out.println("os init in sendFile"); e1.printStackTrace();}
			
			
        	System.out.println("Datei wird gesendet");
        	byte[] buffer = new byte[16384];
		
		 
		 try 
		 {
			 is = new FileInputStream(this.file);
	      while (is.available() > 0) 
          {
           os.write(buffer, 0, is.read(buffer));
          }
          os.flush();
          System.out.println("Datei gesendet");
		 } 
		 catch (FileNotFoundException e) {System.out.println("FILENOTFOUND in sendFile");e.printStackTrace();} 
		 catch (IOException e) {System.out.println("IO in sendFile");e.printStackTrace();}
		 
		 finally
		 {
		  try 
		  {
		   is.close();
		  } 
		  catch (IOException e) {e.printStackTrace();}
		 }
		}
		public void disconnect()
		{
          try {
			os.close();
			socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
        public void run() {
            try {
            	//verbindungsaufbau
               socket = new Socket(this.serverName, this.port);
                if(socket.isConnected())
                {
                	System.out.println("Berbunden zu.."+socket.getRemoteSocketAddress());
                }
                File file = new File("c:/"+fileName);
                System.out.println("Starte übertragung der Datei...."+file.getName());
                sendInformation("Filename.sql","someInformation");
                send(file);
               }  catch (IOException e) {e.printStackTrace();}
        } 
    }

ServerMain
Java:
	import java.io.File;
	import java.util.concurrent.ExecutorService;
	import java.util.concurrent.Executors;

	public class ServerMain 
	{
	 public static void main(String[] args) 
	 {
	  File file = new File("c:/new.txt");
	  Server server = new Server(file, 4711);
	  server.serverThread.start();
	 }
	}

Server Klasse
Java:
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class Server implements Runnable 
{
 File file;
 final int port;
 Thread serverThread=new Thread(this);
 Socket socket ;
 public Server(File file, int port) 
 {
  this.file = file;
  this.port = port;
 }
 public void initInformation()
 {
	 try 
	 {
		DataInputStream is=new DataInputStream(socket.getInputStream());
		String information=is.readUTF();
		System.out.println(information);
		
	} catch (IOException e) {System.out.println("initInformation failed");e.printStackTrace();}
	 
 }
 public void run() 
 {
  try 
  {
   System.out.println(getClass() + " run Server...");
   ServerSocket serverSocket = new ServerSocket(this.port);
   System.out.println("Warte auf Verbindung...........");
   socket= serverSocket.accept();
   System.out.println("Verbindung hergestellt");
   System.out.println("Initialisiere informationen....");
   initInformation();
   System.out.println(getClass() + " Verbunden hat sich: "
                      + socket.getRemoteSocketAddress());
   
   System.out.println(getClass() + " empfange Datei... " + file);
   OutputStream outputStream = new FileOutputStream(file);
   InputStream inputStream = socket.getInputStream();
   byte[] buffer = new byte[16384];
   int len = 0;
   while ((len = inputStream.read(buffer)) > 0) {
	   outputStream.write(buffer, 0, len);
 }

   System.out.println(getClass() + " Datei empfangen....100%");
   inputStream.close();
   outputStream.close();
//   socket.close();
  } 
  catch (IOException e) {e.printStackTrace();}
  }
 }
 
S

SlaterB

Gast
kommt die Meldung erst nach dem Senden oder wie past das reset zu 'es klappt'?

wenn du im Client den DataOutputStream schließt, dann kann danach nichts mehr gesendet werden, die Verbindung ist mindestens halbtot,
generell auf SocketStreams oder sonstige Verknüpfungen immer nur genau einen Stream drüber initialisieren und diesen genau so lange offen halten, wie die gesamte Verbindung steht,

verschiedene Daten senden ist dann nicht leicht, das verstehe ich schon,
aber in diesem Fall kann doch ein DataStream auch byte-Array schreiben und lesen, oder?
 

java66

Aktives Mitglied
Hi Slater

ja die Meldung kommt nachdem alles vorbei ist.
Habe hier die neuere fassung "funktioniert auch so" bis auf die tatsache das er am ende stets einen reset macht.
Bin wie gesagt seit kurzer zeit im bereich sockets wäre dankbar wenn du dir die anhänge mal anschauen bzw. ausführen könntest um vileicht eine aussage zur meldung machen zu können.


Java:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Client implements Runnable {

	String serverName;
	String FileName="deafult";
	Thread start = new Thread(this);
	File file;
	int port;
	Socket socket;
	String fileName;
	InputStream is = null;
	OutputStream os = null;
	DataOutputStream outstream=null ;
	DataInputStream dos=null;
	// -----------------------------------------------------------
	public Client(String serverName, int port, File file) {
		this.serverName = serverName;
		this.port = port;
		this.file = file;
	}

	// -----------------------------------------------------------
	private void sendInformation(String FileName, String Type) {
		try {
			outstream= new DataOutputStream(socket
					.getOutputStream());
			outstream.writeUTF(FileName + "," + Type);
		} catch (IOException e) {
			System.out.println("Send Information Fehler");
			e.printStackTrace();
		}

	}

	// -----------------------------------------------------------
	private void closePorts() {

		try {
			os.close();
			is.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	// -----------------------------------------------------------
	private void send(File file) {
		if (socket == null)
			System.out.println("send(File) socket==null");

		try {
			os = socket.getOutputStream();
		} catch (IOException e1) {
			System.out.println("os init in sendFile");
			e1.printStackTrace();
		}

		System.out.println("Datei wird gesendet");
		byte[] buffer = new byte[16384];

		try {
			is = new FileInputStream(this.file);
			while (is.available() > 0) {
				os.write(buffer, 0, is.read(buffer));
			}
			os.flush();
			System.out.println("Datei gesendet");
		} catch (FileNotFoundException e) {
			System.out.println("FILENOTFOUND in sendFile");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("IO in sendFile");
			e.printStackTrace();
		}

//		finally {
//			try {
////				is.close();
////			} catch (IOException e) {
////				e.printStackTrace();
////			}
////		}
	}
public void getResult()
{
	try 
	{
		dos=new DataInputStream(socket.getInputStream());
		String result = dos.readUTF();
		System.out.println("result");
	}catch (IOException e) {e.printStackTrace();}
	
	
	
}
	// -----------------------------------------------------------
	public void run() {
		try {
			// verbindungsaufbau
			socket = new Socket(this.serverName, this.port);
			if (socket.isConnected()) {
				System.out.println("Verbunden zu.."
						+ socket.getRemoteSocketAddress());
			}
//			this.file = new File("c:/" + fileName);
			System.out.println("Starte übertragung der Datei...."
					+ file.getName());
			sendInformation(this.file.getName(), "CMD");
			send(this.file);
			getResult();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
Java:
import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.swing.JFileChooser;


public class ClientMain 
{
 public static void main(String[] args) 
 {
	 JFileChooser choos=new JFileChooser(".");
	 choos.showDialog(null, null);
	 
  File file = choos.getSelectedFile();
  Client client = new Client("localhost", 4711,file);
  client.start.start();
 }
}
Java:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.StringTokenizer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class Server implements Runnable 
{
 File file;
 final int port;
 Thread serverThread=new Thread(this);
 Socket socket ;
 DataOutputStream dos;
 DataInputStream dis;
 String filename="unknown.dat";
 OutputStream outputStream;
 String clientCMD="0";
 InputStream inputStream;
 String basePath="C:"+File.separator;
 public boolean enable=true;
 ServerSocket serversocket;
 public Server(int port) 
 {
  this.port = port;
 }

//-----------------------------------------------------------
 public void initInformation()
 {
	 try 
	 {
		DataInputStream dis=new DataInputStream(socket.getInputStream());
		String information=dis.readUTF();
		StringTokenizer st=new StringTokenizer(information,",");
		this.filename=st.nextToken();
		this.clientCMD=st.nextToken();
		file=new File(basePath+filename);
		System.out.println(information);
		
	} catch (IOException e) {System.out.println("initInformation failed");e.printStackTrace();}
	 
 }
 public void disconnect()
 {
	 
 }

//-----------------------------------------------------------
 public void sendResult(String result)
 {
	try 
	{
		dos=new DataOutputStream(socket.getOutputStream());
		dos.writeUTF(result);
	} 
	catch (IOException e) {e.printStackTrace();}
	
 }
 public boolean RecievFile()
 {
	 byte[] buffer = new byte[16384];
	   int len = 0;
	try 
	{
		while ((len = inputStream.read(buffer)) > 0) 
		   {
			   outputStream.write(buffer, 0, len);
		   }
		return true;
	} catch (IOException e) {System.out.println(e.getMessage());}
	 return false;
 }
//-----------------------------------------------------------
 public void run() 
 {
  try 
  {
   System.out.println(getClass() + " run Server...");
   serversocket = new ServerSocket(this.port);
   while(enable)
   {
   System.out.println("Warte auf Verbindung...........");
   socket= serversocket.accept();
   System.out.println("Verbindung hergestellt");
   System.out.println("Initialisiere informationen....");
   initInformation();
   System.out.println(getClass() + " Verbunden hat sich: "
                      + socket.getRemoteSocketAddress());
   
   System.out.println(getClass() + " empfange Datei... " + file);
   outputStream = new FileOutputStream(file);
   inputStream = socket.getInputStream();
   RecievFile();
   //   byte[] buffer = new byte[16384];
//   int len = 0;
//   while ((len = inputStream.read(buffer)) > 0) 
//   {
//	   outputStream.write(buffer, 0, len);
//   }
   System.out.println(getClass() + " Datei empfangen....100%");
   sendResult("TEST WURDE ERFOLGREICH AUSGEFÜHRT");
   }
   disconnect();
  } 
  catch (IOException e) {e.printStackTrace();}
  }
 }
Java:
	import java.io.File;
	import java.util.concurrent.ExecutorService;
	import java.util.concurrent.Executors;

	public class ServerMain 
	{
	 public static void main(String[] args) 
	 {
	  Server server = new Server(4711);
	  server.serverThread.start();
	 }
	}
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
ich bleibe noch bei den Streams:
auch wennn du nun die DataStreams nicht sofort schließt,
finde ich es immer noch unsauber, quasi gleichzeitig nebenher direkt in den OutputStream zu schreiben,

ein Stream hat mehrere Zwischenstationen und ein Anfang und ein Ende, da kann man nicht zwischendurch was einschmuggeln oder wieder herausnehmen,
alles genau am Anfang rein und am Ende raus,

auch nicht zunächst nur den OutputStream für sich verwenden, bevor dann später ein DataOutputStream drauf kommt und dann 'nur noch' über DataOutputStream,
alles geordnet, alles gleich, die ganze Verbindung,
am besten in beide Richtungen die gleichen Streams, aber das wär nun nicht so wichtig ;)

den Rest möchte ich nicht ausprobieren, gibt diverse Varianten, sieht grob ok aus,
wenn was funktioniert, kann es so schlecht nicht sein


Methoden übrigens klein schreiben
> public boolean RecievFile()
 

java66

Aktives Mitglied
OK danke werde dann mal weiter probieren und versuchen eine bessere lösung für das funktionierende und moeglichkeiten für das nicht funktionierende zu finden.

Danke für deine Tips.
THX
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Bei FTP Übertragung wird Datei nicht komplett übertragen Netzwerkprogrammierung 2
T Anwendungseinstellungen ohne Datei übertragen? Netzwerkprogrammierung 8
S ActiveMQ, JMS und Datei übertragen Netzwerkprogrammierung 25
P Socket Datei von Client zum Server übertragen --> Weiterleitung an Clients Netzwerkprogrammierung 16
S über rmi datei übertragen? Netzwerkprogrammierung 2
G.I.Joe Datei per POST übertragen Netzwerkprogrammierung 2
S Unix Datei vom Server nach Windows übertragen Netzwerkprogrammierung 8
J Datei Download vom Server Netzwerkprogrammierung 8
H Datei mit Anhang via http "hochladen" Netzwerkprogrammierung 16
E JCIFS - Smb - Datei kann nur von einem Benutzer bearbeitet werden Netzwerkprogrammierung 1
Aruetiise Socket Datei Endung Netzwerkprogrammierung 6
A FTP wie kann ich von java auf datei in fpt://192.168.178.1 lesen/schreiben? Netzwerkprogrammierung 3
K HTTP Formulare füllen und Datei downloaden Netzwerkprogrammierung 23
B JSch Filetransfer ohne KnownHosts Datei? Netzwerkprogrammierung 0
A Datei erzeugen und auf der Weboberfläche downloaden (Tomcat) Netzwerkprogrammierung 4
Sogomn HTTP Datei herunterladen Netzwerkprogrammierung 13
C Inhalt einer .JPG Datei in einen OutputStream schreiben? Netzwerkprogrammierung 10
F FTP FTPClient Datei lässt sich nicht öffnen Netzwerkprogrammierung 4
F HTTP Serialisierte Objekte aus Datei von Server Netzwerkprogrammierung 1
F FTP Einzelne Datei von FTP-Server überprüfen Netzwerkprogrammierung 0
L FTP Lesen einer Datei vom Server - Aufgehangen Netzwerkprogrammierung 0
M jsf-seite beim hinzufügen einer csv-datei in einen ordner aktualiseren Netzwerkprogrammierung 0
D Einfache Verbindung zu Linux Server und Datei auslesen Netzwerkprogrammierung 13
S Datei(XML) per RMI an Server schicken Netzwerkprogrammierung 0
V Datei Download Fenster Netzwerkprogrammierung 9
S Datei schreiben über Applet Netzwerkprogrammierung 8
C Socket Datei Übertragung Netzwerkprogrammierung 5
D Datei hochladen zu PHP Server Netzwerkprogrammierung 8
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
K HTTP Eigener Http Response für Datei-Download Netzwerkprogrammierung 4
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
T Datei downloaden ohne den Dateinamen zu kennen Netzwerkprogrammierung 2
H Datei in DropBox schreiben Netzwerkprogrammierung 23
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
V Datei auf Server Schreiben Netzwerkprogrammierung 18
N Einen Server als ausführbare Datei exportieren Netzwerkprogrammierung 15
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
B FTP Datei auslesen ohne einloggen möglich? Netzwerkprogrammierung 19
C Datei auf server speichern Netzwerkprogrammierung 16
P FTP Nochmal wachsende Datei per FTP lesen Netzwerkprogrammierung 9
W Datei automatisiert kopieren! Netzwerkprogrammierung 5
P Wachsende Datei per FTP lesen Netzwerkprogrammierung 2
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
S Servlet - Datei kann nicht gelöscht werden Netzwerkprogrammierung 12
G Txt datei von Website downloaden Netzwerkprogrammierung 8
R HTTP Apache HTTP Client: Request mit angehängter Datei Netzwerkprogrammierung 2
I HTTP Datei Uploaden mit http und Sprache anpassen Netzwerkprogrammierung 7
1 Datei senden/empfangen funzt nicht... Netzwerkprogrammierung 5
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
U Web Datei downloaden und bei Änderungen wieder zurückspielen Netzwerkprogrammierung 5
M Class-Datei aus Eclipse mit Xampp Netzwerkprogrammierung 4
A HTTP Download einer Datei mit "Statistiken" Netzwerkprogrammierung 2
B Zugriff auf eine Text- und XML-Datei Netzwerkprogrammierung 4
Dit_ FTP, Datei Hochladen Netzwerkprogrammierung 4
Ollek Download einer Datei durch SFTP mit Java Netzwerkprogrammierung 12
P Name der Download-Datei ermitteln Netzwerkprogrammierung 8
N Socket TCP Datei Transfer Netzwerkprogrammierung 2
L Java über php datei lesen? Netzwerkprogrammierung 18
Akrillo Datei per Netzwerk senden Netzwerkprogrammierung 10
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
L Größe einer Datei auslesen die im Netz liegt Netzwerkprogrammierung 4
weeego Ping über CMD, Umweg über Batch Datei sparen. Netzwerkprogrammierung 17
R Versenden einer MIME-Datei per E-Mail [solved] Netzwerkprogrammierung 5
O Mehrere Datei per DataInput/OutputStream über Socket Netzwerkprogrammierung 12
S StringArray in .txt Datei --> langsam wegen Client/Server!? Netzwerkprogrammierung 16
S Bild-Datei von Servlet an Browser senden Netzwerkprogrammierung 8
U Datei via UDP Netzwerkprogrammierung 8
C Dateigröße einer Datei im Internet ermitteln Netzwerkprogrammierung 2
S Error 404 obwohl die Datei existiert Netzwerkprogrammierung 9
T Datei Herunterladen und ausführen Netzwerkprogrammierung 5
S Mittels Java XML abfragen und nicht die Ausgabe-HTML-Datei Netzwerkprogrammierung 5
C PCAP Datei auslesen Netzwerkprogrammierung 8
F Applet Datei Zugriff Netzwerkprogrammierung 13
G Datei performant im Netzwerk verschieben Netzwerkprogrammierung 4
M [Commons NET] Prüfen, ob auf FTP Datei vorhanden ist Netzwerkprogrammierung 2
Rontu Problem beim Übertragen einer Datei Netzwerkprogrammierung 9
E Größe der Datei vor Download ermitteln Netzwerkprogrammierung 3
C Dateiübertragung - Datei immer ein 4096faches von n Netzwerkprogrammierung 2
E Applet zum Datei-Upload Netzwerkprogrammierung 3
A FileChannel+SocketChannel:Datei wird nur teilweise übertrage Netzwerkprogrammierung 4
J Gibts die Datei? Netzwerkprogrammierung 3
K Datei-Upload per FTP Netzwerkprogrammierung 2
G Fehlermeldung beim Erzeugen der WSDL Datei unter Axis Netzwerkprogrammierung 2
J Zeilenweises auslesen aus einer Datei über Server Netzwerkprogrammierung 6
G Datei über ObjectInputStream versenden Netzwerkprogrammierung 8
B Umfangreiche Batch Datei (Rmiregistry prüfung + Prog. start) Netzwerkprogrammierung 4
V Einen Eintrag aus einer Zip Datei von einem Server laden Netzwerkprogrammierung 2
M Datei auf einem Server ausführen Netzwerkprogrammierung 4
N Dateigröße einer Datei auf einem HTTP-/Web-Server. Netzwerkprogrammierung 9
W fehlerhafte Datei nach Dateitransfer per ServletOutputStream Netzwerkprogrammierung 2
F Datei senden und empfangen Netzwerkprogrammierung 4
B Via Java Datei zu PHP-Script auf Apache hochladen Netzwerkprogrammierung 4
B knacken bei download von mp3 datei Netzwerkprogrammierung 2
T Datei senden Netzwerkprogrammierung 3
M Datei auf Remoteserver kopieren Netzwerkprogrammierung 8
B Datei speichern unter Netzwerkprogrammierung 10
B Laden einer *.csv Datei von einem Webserver (http-request) Netzwerkprogrammierung 8
R In Text Datei schreiben die auf einem Server liegt Netzwerkprogrammierung 8
T Musik-Stream: Server sendet die Datei zu schnell ? Netzwerkprogrammierung 3
T Mit FTP verbinden, einen Ordner erstellen und Datei löschen Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben