Mein FileTransfer Programm

Status
Nicht offen für weitere Antworten.

Ruescherl

Mitglied
Hallo Leute,

Also ich habe jetzt in Programmieren das Projekt angenommen, ein FileTransfer Programm zu schreiben! Ich bin jetzt gerade beim Testen, und da habe ich ein Problem: Ich sende den "Server" des Programms jede 300ms per DatagramSocket-Broadcast aus. Aber wenn ich nachher beim Client die Daten des Pakets mit packet.getData().toString() ausgeben, dann kommt nur ne Nachricht die ca so aussieht [B@1add63

Keine Ahnung was das ist, denn ich habe auch mit Ethereal die UDP Paket beim Empfänger analysiert, und sie kommen an und enthalten die richtigen Daten! Was mache ich denn falsch?


Code:
s=new DatagramSocket(23300);

........

DatagramPacket ds=new DatagramPacket("test".getBytes(),"test".getBytes().length);
			
			while(this.run==true)
			{
				if(s!=null)
				{
					s.receive(ds);
				}
				
				rec=ds.getData().toString();

System.out.println(rec);

                         ..........

mfg
 

Ruescherl

Mitglied
Ich habe die Lösung gefunden! Anscheinend funktioniert toString() bei einem Byte Array nicht richtig! =/
So ein Schwachsinn! :x
 
B

Beni

Gast
Die funktioniert schon richtig: da steht der Typ, und die Speicheradresse des Arrays :wink:

Wenn du den Inhalt willst: "Arrays.toString" kann dir helfen.
 

Stiewen

Aktives Mitglied
Na na na, bevor man über Java meckert erst mal richtig lesen, was bei dem, was du programmiert hast, komisch ist!

Für alle, die hier noch mal reinschauen und auch für Ruescherl: Schau doch noch mal ins Javabuch oder in die API, was dir
Code:
DatagramPacket.getData()
liefert!

Meiner Meinung nach wird ein byte[] geliefert! Schaut mal: http://www.galileocomputing.de/openbook/javainsel3/javainsel_160014.htm#Rxxjavainsel_160014445DatagrammeunddieKlasseDatagramPacket

Lösung: String s = new String(DatagramPacket.getData());
 

Ruescherl

Mitglied
Stiewen hat gesagt.:
Na na na, bevor man über Java meckert erst mal richtig lesen, was bei dem, was du programmiert hast, komisch ist!

Für alle, die hier noch mal reinschauen und auch für Ruescherl: Schau doch noch mal ins Javabuch oder in die API, was dir
Code:
DatagramPacket.getData()
liefert!

Meiner Meinung nach wird ein byte[] geliefert! Schaut mal: http://www.galileocomputing.de/openbook/javainsel3/javainsel_160014.htm#Rxxjavainsel_160014445DatagrammeunddieKlasseDatagramPacket

Lösung: String s = new String(DatagramPacket.getData());

Das weiß ich auch, das getData ein byte Array liefer, so blind bin ich nicht *gg*
und deine Möglichkeit: "Lösung: String s = new String(DatagramPacket.getData());"
funktioniert nicht, das habe ich schon versucht!

Habe das Problem aber mittlerweile gelöst! Dafür aber ein anderes =/
Ich bekomme immer nur ein 4 Byte langen String, obwohl ich einen 7 Byte weggeschickt habe
Vor dem Senden ist er noch 7 Byte lang, beim Empfangen auf einmal 4 Byte!
kA was das ist!

mfg
 

Stiewen

Aktives Mitglied
Um so ein DatagramSocket zu erzeugen muss man ihm ja auch sagen, wie lang die Nachricht sein kann... vll haste es nur ein mal erzeugt und dort nur 4 Bytes angesagt...

Hier zB. wäre der Fehler so in der Art:
Code:
new DatagramPacket("test".getBytes(),"test".getBytes().length);
wenn du deinen param ds nicht noch mal änderst, dann kannst du mit ds nur noch 4 bytes entgegen nehmen.

Lösung: einfach immer bevor du was annimmst ds neu erzeugen ...
 

Ruescherl

Mitglied
Hallo,

Danke mal für die vorigen Antworten! Ihr habt mir sehr geholfen =)
Aber jetzt eine neue Frage:
Mein Code zum Übertragen sieht so aus:

Code:
char c[]=new char[1];
			
			try
			{
									sock	=new Socket(send,24522);
				BufferedReader 		br		=new BufferedReader(new InputStreamReader(sock.getInputStream()));
				BufferedWriter		bw		=new BufferedWriter(new FileWriter(path));
				
				while(!finished)
				{
					br.read(c);
					System.out.println(c[0]);
					bw.write(c);
					bw.flush();
				}
				
				System.out.println("FILE TRANSFER FILE: Übertragung abgeschlossen!");
				sock.close();
				br.close();
				bw.close();
				
			}
			catch(Exception ex)
			{
				System.out.println("FILE TRANSFER FILE: Fehler beim Initialisieren " + Boolean.toString(get));
			}

Beim Sender auch so, nur das da halt umgekehrt funktioniert!

Nur ich habe ein Problem: Bei Textdateien funktioniert das einwandfrei(alles wird übertragen, Programm hängt sich nicht auf) doch wenn ich etwas anderes als Test übertragen will, wie zB Bilder, Archive,... Dann hängt sich das Programm auf, und wenn ich beim Empfänger in die Datei schaue, sehe ich nur ein Zeichen! Keine Ahnung was das sein kann! War meine Überlegung falsch das ich auch aus Bildern Byteweise(also char) rauslesen kann, oder geht das nicht?

mfg
 

Stiewen

Aktives Mitglied
Also, *Lufthol*
1. Du verwendest einen BufferedReader. Der Name sagt schon, dass da ein Buffer drin ist, was so viel heißt, wie: Du kannst mehrere Zeichen zusammen übertragen! -> nimm einen Byte, den du sendest!
Dazu:
[@param longFileSizeLeft ist die Filegröße, die noch in die Datei geschrieben werden muss]
[@param longMaxBuffer ist einfach nur der Maximale Buffer (Beispiel: 1024 Zeichen kann dieser hier aufnehmen)]
Achtung: Manche Variablen sind hier nicht deklariert/ initalisiert
Code:
      disIn = new DataInputStream(new BufferedInputStream(soClient.getInputStream()));
      dosOut = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("Download/" + strFile)));

      byte[] buffer = getBuffer();
      while ( disIn.read(buffer) != -1 ) {
        dosOut.write(buffer);
        dosOut.flush();

        longFileSizeLeft -= buffer.length;

        buffer = getBuffer();
      }
      disIn.close();
      dosOut.close();
      soClient.close();
Hier die Methode getBuffer():
Code:
  public byte[] getBuffer (  ) {
    if ( longFileSizeLeft >= longMaxBuffer ) {
      return new byte[(int)longMaxBuffer];
    } else {
      return new byte[(int)longFileSizeLeft];
    }
  }

2. Du hast als bedingung im Schleifenkopf !finished. Is gut ausgedacht... halte ich aber für net so gut und wird standartmäßig auch anders gezeigt. Wenn du mal in meinem Source [Quelltext] guckst, dann siehst du, dass ich
Code:
while ( disIn.read(buffer) != -1 ) {
genommen habe, denn: wenn du das Socket beim Sender schließt, was du sowieso nach der Übertragung aller Zeichen machst, wird -1 versendet, sodass du dies als Zeichen der Beendigung der Datenübertragung erkennen kannst.

3. Wenn du die Methode so geschrieben hast, dass sie bei allen Dateien 100% funktioniert, so schreibe sie bitte, bitte, bitte, bitte hier in diesen Thread! -> Damit ersparst du vielen Menschen eine Menge Sucharbeit!

Hoffe ich konnte ein wenig helfen und es war net zu kompliziert.

Stiewen
 

Ruescherl

Mitglied
Hallo,

Hab das jetzt gelöst, aber ein LETZTES Problem habe ich noch! Wenn ich ein Bild,Rar übertrage sind die danach defekt! Ich habe mal die defekten und Originalen Dateien miteinander verglichen(auch Java) und dann bin ich daraufgekommen, dass im falschen File statt (char)65533 immer (char)63 drinnensteht! Beides sind Fragezeichen wenn man sie als char ausgibt!

Als Lösung hätte ich mir überlegt, dass ich das File beim Empfänger nochmal durchgehe und alle 63er Fragezeichen durch die 65533 ersetzte! Das funktioniert aber insofern nicht, wenn in dem File Textfragezeichen sind, die auch den 63er Code haben. Das würde ja den Binär-Code verfälschen!

Was wäre eine Lösung?

Hier mein Code:

Code:
try
		{
			int	g=64;
			char c[]=new char[g];
			
			System.out.println("FILE TRANSFER FILE: Übertragung wird eingeleitet");
			
			BufferedReader 	br=new BufferedReader(new FileReader(path));
			PrintWriter		pw=new PrintWriter(sock.getOutputStream());
			int 			z;
			
			while((z=br.read(c))!=-1)
			{
				if(z<g)
				{
					char[] h=new char[z];
					System.arraycopy(c,0,h,0,z);
					
					c=new char[z];
					System.arraycopy(h,0,c,0,z);
				}
				
				for(int i=0;i<z;i++)
				{
					if((int)c[i]==63) 
				}
				
				System.out.println("Gesendet:" + c[0]);
				pw.write(c);
				pw.flush();
				c=new char[128];
			}
			
			nwm.sendMessage("f ",rec,23300);
			
			System.out.println("FILE TRANSFER FILE: Übertragung beendet!");
			
			br.close();
			pw.close();
			close();
		}
		catch(Exception ex)
		{
			System.out.println("FILE TRANSFER FILE: Fehler beim Übertragen des Files");
			System.out.println(ex);
		}
 
R

Roar

Gast
seit wann kann man mit einem writer binärdateienschreiben? writer und reader schreiben und lesen text. benutz einfach einen FileOutputStream.
 

Ruescherl

Mitglied
Danke Leute! Meine Übertragung funktioniert jetzt für alle Files! Super! :D
Werde den Code dann updaten wenn ich das Programm komplett fertig habe!
 

Stiewen

Aktives Mitglied
Und die Leute warten auf den versprochenen Source, ...

und warten ...

und warten ...

und warten ...

und warten ...

und warten ...


umsonst....
 

Ruescherl

Mitglied
Oh, sry hab ganz darauf vergessen ^^

EMPFÄNGER:
Code:
try
			{
									sock	=new Socket(send,24522);
				DataInputStream 	dis		=new DataInputStream(new BufferedInputStream(sock.getInputStream()));
				DataOutputStream 	dos		=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path)));
				
				while((z=dis.read(c))!=-1)
				{
					if(z<g)
					{
						byte[] h=new byte[z];
						System.arraycopy(c,0,h,0,z);
						
						c=new byte[z];
						System.arraycopy(h,0,c,0,z);
					}
					
					dos.write(c);
					dos.flush();
					c=new byte[g];
				}
				
				nwm.mother.gui.println("FILE TRANSFER FILE: Übertragung abgeschlossen!");
				sock.close();
				dis.close();
				dos.close();
				
			}
			catch(Exception ex)
			{
				nwm.mother.gui.println("FILE TRANSFER FILE: Fehler beim Initialisieren " + Boolean.toString(get));
			}

SENDER:
Code:
try
		{
			int	g=64;
			byte c[]=new byte[g];
			
			nwm.mother.gui.println("FILE TRANSFER FILE: Übertragung wird eingeleitet");
			
			DataInputStream		dis=new DataInputStream(new BufferedInputStream(new FileInputStream(path)));
			DataOutputStream	dos=new DataOutputStream(new BufferedOutputStream(sock.getOutputStream()));
			int 				z;
			
			while((z=dis.read(c))!=-1)
			{
				if(z<g)
				{
					byte[] h=new byte[z];
					System.arraycopy(c,0,h,0,z);
					
					c=new byte[z];
					System.arraycopy(h,0,c,0,z);
				}
				
				dos.write(c);
				dos.flush();
				c=new byte[128];
			}
			
			nwm.sendMessage("f ",rec,23300);
			
			nwm.mother.gui.println("FILE TRANSFER FILE: Übertragung beendet!");
			
			dos.close();
			dis.close();
			close();
		}
		catch(Exception ex)
		{
			nwm.mother.gui.println("FILE TRANSFER FILE: Fehler beim Übertragen des Files");
		}
	}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Messoras Launcher für mein Spiel Netzwerkprogrammierung 7
M Wo ist mein Fehler ? o: Netzwerkprogrammierung 4
C Über welchen Netzwerkadapter kommt mein receive? Netzwerkprogrammierung 15
P Warum lässt sich mein Server und mein Client einfach nicht schließen?!?! Netzwerkprogrammierung 16
lacyuu Warum empfängt mein Stream keinen Input? Netzwerkprogrammierung 4
T Wieso ist mein Objekt leer? Netzwerkprogrammierung 6
G server für mein spiel. Netzwerkprogrammierung 5
A mein Code compiliert nicht! Netzwerkprogrammierung 2
T Proxy will einfach nicht mein prog akzeptieren Netzwerkprogrammierung 3
B JSch Filetransfer ohne KnownHosts Datei? Netzwerkprogrammierung 0
C Java NIO Urlconnection Filetransfer Netzwerkprogrammierung 14
N RMI Designfrage zu autorisiertem Filetransfer Netzwerkprogrammierung 17
S Socket Einfacher filetransfer Netzwerkprogrammierung 10
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
G Programm unter anderer IP ausführen Netzwerkprogrammierung 6
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
A Classpath Tomcat, Start von Programm aus Tomcat Container Netzwerkprogrammierung 1
M Java-Programm aus dem Web laden Netzwerkprogrammierung 3
E Eingabe (auf Internetseite) durch ein Programm machen lassen Netzwerkprogrammierung 19
T UDP Pakete empfangen ohne Programm zu blockieren Netzwerkprogrammierung 3
S HTTP Servlet als Instanzen im Programm starten Netzwerkprogrammierung 3
M Paktete abfangen und zu eigenem Programm umleiten - wie? Netzwerkprogrammierung 5
C Programm per Hompage ansprechen Netzwerkprogrammierung 4
T Download Programm - Download endet vorzeitig (bricht ab) Netzwerkprogrammierung 11
K Programm als Webservice laufen lassen Netzwerkprogrammierung 5
G ObjectInputStream hängt ganzes Programm auf... Netzwerkprogrammierung 7
C Vom Server Programm auf Client starten Netzwerkprogrammierung 2
J net send Popups abfangen und in eigenem Programm ausgeben. Netzwerkprogrammierung 12
M Befehle an externes Java-Programm senden Netzwerkprogrammierung 8
D client programm, passwortverschlüsselung Netzwerkprogrammierung 16
S HTTP Kleines Programm für den Routerneustart Netzwerkprogrammierung 3
M Java-Programm als Webserver erzeugt HTML Netzwerkprogrammierung 8
J Framework/ Muster für Chat-ähnliches Programm gesucht Netzwerkprogrammierung 2
N Datenaustausch zwischen Java-GUI und PHP-Programm über SOAP Netzwerkprogrammierung 19
1 Kommunikation mit externem Programm über TCP Netzwerkprogrammierung 2
B Server-Programm wird durch "read" beendet Netzwerkprogrammierung 8
P Wie gibt man einem GUI Programm ein Web interface? Netzwerkprogrammierung 5
A Programm umschreiben von Pipes auf Sockets Netzwerkprogrammierung 12
P Java Programm als Dienst auf Server Netzwerkprogrammierung 11
T Theoriefrage : Programm-zugriffsrechte auf Netzlaufwerk Netzwerkprogrammierung 14
J Mit Java Anwendung ein (externes) Programm auf einem AIX Rechner starten Netzwerkprogrammierung 6
S Commons Net 2.0 und FTP in meinem Programm Netzwerkprogrammierung 4
lordcarlos Erstes TCP programm - output stream problem Netzwerkprogrammierung 2
A Probleme mit kleinem Netzwerk Programm Netzwerkprogrammierung 30
L RMI Programm beendet ohne Fehler sofort nach Start (Windows 2000) Netzwerkprogrammierung 7
L SSL Verbindung aber Server wird erst im Programm festgelegt Netzwerkprogrammierung 4
J programm zum autom. ausdruck einer webseite Netzwerkprogrammierung 2
A Probleme mit kleinem Messenger-Programm Netzwerkprogrammierung 4
L Programm in der RMIRegistry anmelden und benutzen (RMI) Netzwerkprogrammierung 4
H Webserver mit PHP als Java-Programm, gibt es schon so etwas? Netzwerkprogrammierung 12
A Java-Programm auf einem Server laufen lassen Netzwerkprogrammierung 9
F Chat Programm. Verständnisfrage while-Schleife Netzwerkprogrammierung 7
P Probleme bei Chat programm Netzwerkprogrammierung 2
M Log In Programm für Seiten Netzwerkprogrammierung 2
A download programm Netzwerkprogrammierung 2
G Einfaches Client-Server Programm (verbindungslos) Netzwerkprogrammierung 2
L RMI-Programm ausführen Netzwerkprogrammierung 6
J Java Programm für Upload von Dateien per HTTP Netzwerkprogrammierung 7
J Server soll Zugriff auf Java Programm ermöglichen Netzwerkprogrammierung 3
A JSP->Servlet->Programm (Ausführung) -> Servlet -&gt Netzwerkprogrammierung 2
L einfaches Programm zum herunterladen von Bildern Netzwerkprogrammierung 2
V probleme mit dem chat programm Netzwerkprogrammierung 4
N Hexcode an ein Programm senden. Netzwerkprogrammierung 4
T Kann man jeden Port für Programm verwenden? Netzwerkprogrammierung 2
B Wie Router einstellen für CLient-Server-Programm? Netzwerkprogrammierung 4
B Client-Server-Programm! Netzwerkprogrammierung 9
S P2P Programm Netzwerkprogrammierung 2
H E-Mail Programm Netzwerkprogrammierung 3
G Chat Programm - was ist los? Netzwerkprogrammierung 9

Ähnliche Java Themen

Neue Themen


Oben