[Java/Android] UDP Pakete verschicken

unull

Nervensäge
So,

ich bastel mir gerade eine Android App, die im wesentlichen eine Art 'netcat' sein soll. Bisher habe ich einen funktionierenden TCP-Client und einen UDP-Client, welche ich jeweils mit einem 'netcat' auf meiner Workstation durchteste. Ich kann in beiden Clients Textnachrichten and die Gegenstelle senden und auch Binaries (Blobs, Bilder z.B. ueber das Share Menu in Android).

Bei TCP geht das mit Bildern beispielsweise problemlos, d.h. ich starte 'netcat' auf meinem PC z.B. mit 'nc -l -p 6000 > foo.jpg' und nach der Uebertragung kann ich das Bild oeffnen.

Bei UDP bin ich aber auf folgendes Problem gestossen: Sobald das File eine gewisse Groesse hat, kann ich es nicht mehr in ein UDP Datagramm verpacken. Das wird einfach nicht versendet, ohne Exception oder aehnliches. Ich weiss dass es da einen theoretische Maximalgroesse gibt, aber da sollte ich mit 35kb noch weit davon entfernt sein.

Jetzt zerlege ich das Byte-Array in 4096 Byte grosse Bloecke (wie mach sowas netcat?) und versende die sequentiell:

Code:
try {
    int num_packets = (int) Math.ceil(data.length/4096.0);
    Log.i(TAG, "Sending "+num_packets+" packets");
    for(int i = 0; i < num_packets; i++) {
	byte[] tmp = new byte[4096];
	System.arraycopy(data, i*4096, tmp, 0, (data.length-i*4096)%4096);
	DatagramPacket packet = new DatagramPacket(tmp, tmp.length, InetAddress.getByName(host), port);
	socket.send(packet);
	Log.i(TAG, "Sent! "+i);
}
...

Das Bild kommt damit am anderen Ende an, aber jedoch in der falschen Reihenfolge :/ Damit gibt es dann noch andere Artefakte, wie falschen Farben z.B.

Das muss doch irgendwie zu machen sein, dass die Bloecke korrekt am anderen Ende ankommen?

PS: Mir ist schon klar, dass TCP besser fuer so etwas ist, aber von einem 'netcat' zum anderen kann ich auch problemlos Binaries transferieren. Ausserdem sollte man doch davon ausgehen koennen, dass im lokalen Netz die Daten in der Reihenfolge ankommen, in der sie verschickt werden?
 
udp hat keine in-order Garantie. Du wirst ein Übertragungsprotokoll machen müssen, bei dem im "header" jedes Fragments seine Fragmentnummer steht.
 
Ich weiss nun, was das Problem ist. Die Zeile

Code:
System.arraycopy(data, i*4096, tmp, 0, (data.length-i*4096)%4096);

stimmt nur fuer das letzte Paket.

Code:
	if (i == num_packets -1)
		System.arraycopy(data, i*4096, tmp, 0, (data.length-i*4096)%4096);
	else 
		System.arraycopy(data, i*4096, tmp, 0, 4096);

Das funktioniert hier lokal.
 
Zurück
Oben