Hallo liebe Leut, Experten
ich hänge seit einiger Zeit an einem Problem, vielleicht könnt ihr mir helfen.
ich möchte eine Datei sicher versenden. Es geht dabei um Netzwerk Protokol Kram. dass heisst UDP etwas sicherer machen mit Checksumme etc. Diesen Teil habe ich aber eigentlich verstanden.
Es geht mehr um java Grundlagen zu Pfadangabe (deswegen dieses Forum)
Ich verwende dazu folgenden Code. Über die Console kann man den Dateinamen, ZielIP und Port angeben.
Leider bekomme ich immer nur Exceptions bzw die Fehlermeldung "Lost Package" wegen dem SOcket TimeOut. Ich denke es liegt daran dass er die Datei nicht findet. Ich habe schon einiges an schreibweisen ausprobiert. Vielleicht weiss einer was ich eingeben muss.
(das mit der Checksumme usw könnt ihr getrost weglassen.) es nur darum dass ich mal eine datei verschicken kann.
es gibt noch ein Programm FileReceiver das bei mir auf dem gleichen Rechner läuft, also adressiere ich 127.0.0.1 und den passenden Port.
der Receiver macht grob nur in einer while schleife:
Vielen herzlichen Dank für eure Hilfe
Ich wäre euch super dankbar wenn einer eine Idee hätte
gruß Helmut
ich hänge seit einiger Zeit an einem Problem, vielleicht könnt ihr mir helfen.
ich möchte eine Datei sicher versenden. Es geht dabei um Netzwerk Protokol Kram. dass heisst UDP etwas sicherer machen mit Checksumme etc. Diesen Teil habe ich aber eigentlich verstanden.
Es geht mehr um java Grundlagen zu Pfadangabe (deswegen dieses Forum)
Ich verwende dazu folgenden Code. Über die Console kann man den Dateinamen, ZielIP und Port angeben.
Leider bekomme ich immer nur Exceptions bzw die Fehlermeldung "Lost Package" wegen dem SOcket TimeOut. Ich denke es liegt daran dass er die Datei nicht findet. Ich habe schon einiges an schreibweisen ausprobiert. Vielleicht weiss einer was ich eingeben muss.
(das mit der Checksumme usw könnt ihr getrost weglassen.) es nur darum dass ich mal eine datei verschicken kann.
Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketTimeoutException;
import java.nio.ByteBuffer;
import java.util.Scanner;
import java.util.zip.Adler32;
public class FileSender
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in); // Eingabe für FileName
System.out.print("Enter Filename: ");
String input = in.next(); //Filename
File file = new File(input);
System.out.print("Enter Ziel IP: ");
String remote = in.next(); //IP Adresse
System.out.print("Enter Ziel Port: ");
int port = in.nextInt(); //Zielport
sendFile(file, remote, port);
}
private static void sendFile(File file, String address, int port) //File laden und versenden
{
byte ackAlt = 0;
byte[] ackNeu = {0};
byte[] sendBytes = new byte[1400];
try
{
FileInputStream input = new FileInputStream(file); //File holen
String filepath = file.getName();
String filename = filepath.substring(filepath.lastIndexOf("\\")+1);
byte[] tmp = filename.getBytes();
byte[] filenameBytes = new byte[1400];
System.arraycopy(tmp, 0, filenameBytes, 0, tmp.length);
filenameBytes[filenameBytes.length -1] = 2;
byte[] check = calculateChecksum(filenameBytes);
System.arraycopy(check, 0, filenameBytes, 1380, check.length);
filenameBytes[filenameBytes.length -2] = (byte) check.length;
DatagramSocket socket = new DatagramSocket(9010);
socket.setSoTimeout(10000);
DatagramPacket sendPacket = new DatagramPacket(filenameBytes, filenameBytes.length, InetAddress.getByName(address), port);
DatagramPacket received = new DatagramPacket(ackNeu, 1, InetAddress.getByName(address), 9010);
while(true)
{
if(ackAlt != ackNeu[0] && input.available() > 0)
{
try
{
sendBytes = new byte[1400];
tmp = new byte[1380];
input.read(tmp);
System.arraycopy(tmp, 0, sendBytes, 0, tmp.length);
sendBytes[sendBytes.length -1] = ackAlt;
check = calculateChecksum(sendBytes); //berechne Checksumme unten Adler32
System.arraycopy(check, 0, sendBytes, 1380, check.length);
sendBytes[sendBytes.length -2] = (byte) check.length;
sendPacket = new DatagramPacket(sendBytes, sendBytes.length, InetAddress.getByName(address), port);
if(ackNeu[0] == 2)
ackNeu[0] = 1;
ackAlt = ackNeu[0];
}
catch(IOException ioex)
{
;
}
socket.send(sendPacket);
}
try
{
socket.receive(received);
ackNeu = received.getData();
if(input.available() <= 0)
{
sendBytes[sendBytes.length -1] = 3;
sendPacket = new DatagramPacket(sendBytes, sendBytes.length, InetAddress.getByName(address), port);
socket.send(sendPacket);
}
if(ackNeu[0] == 3 && input.available() <= 0)
{
break;
}
}
catch(SocketTimeoutException timeoutEx)
{
if(ackNeu[0] == 3 && input.available() <= 0)
{
break;
}
System.out.println("Lost package.");
socket.send(sendPacket);
continue;
}
catch(IOException ex)
{
if(ackNeu[0] == 3 && input.available() <= 0)
{
break;
}
}
}
}
catch(IOException e)
{
}
}
private static byte[] calculateChecksum(byte[] bytes) //Checksumme berechnen
{
Adler32 adler = new Adler32(); // Klasse zum berechnen der Checksumme nach Mark Adler, gilt für 32 bit Zahlen
adler.reset();
adler.update(bytes);
ByteBuffer bb = ByteBuffer.allocate(8);
return bb.putLong(adler.getValue()).array();
}
}
es gibt noch ein Programm FileReceiver das bei mir auf dem gleichen Rechner läuft, also adressiere ich 127.0.0.1 und den passenden Port.
der Receiver macht grob nur in einer while schleife:
Java:
socket.receive(receivedPacket);
received = receivedPacket.getData();
fileBytes = new byte[received.length -20];
Vielen herzlichen Dank für eure Hilfe
Ich wäre euch super dankbar wenn einer eine Idee hätte
gruß Helmut