# Mein FileTransfer Programm



## Ruescherl (10. Mrz 2006)

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?



```
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 (10. Mrz 2006)

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


----------



## Beni (10. Mrz 2006)

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 (10. Mrz 2006)

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

```
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 (10. Mrz 2006)

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
> 
> ...



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 (10. Mrz 2006)

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:

```
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 (11. Mrz 2006)

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:


```
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 (11. Mrz 2006)

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

```
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():

```
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 
	
	
	
	





```
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 (12. Mrz 2006)

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:


```
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);
		}
```


----------



## Roar (12. Mrz 2006)

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


----------



## Ruescherl (12. Mrz 2006)

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


----------



## Stiewen (19. Mrz 2006)

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

und warten ... 

und warten ...

und warten ...

und warten ...

und warten ...


umsonst....


----------



## Ruescherl (19. Mrz 2006)

Oh,  sry hab ganz darauf vergessen ^^

EMPFÄNGER:

```
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:

```
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");
		}
	}
```


----------

