Socket DateiVersand

Firekill

Mitglied
Hallo,

Ich hoffe mir kann hier jemand helfen :)

Ich hab ein Client Server Programm geschrieben über ein Socket.
Jetzt würde ich gerne eine zweite Socket aufbauen, wo die Clients Dateien versenden können und empfangen. Das Socket soll sich jedoch gleich wieder schießen nach datei Empfang oder Versand. Ist das schlecht oder kann man das machen?

Wie kann ich das dann machen das ich ein Pfad + DateiName zuvor schicke und er die Datei dann dort einfügt!

Ich hoffe ich habe mich verständlich ausgedrückt :)

Vielen Dank für die Hilfe!

Mit freundlichen Grüßen

Manfred Fischer
 

Xeonkryptos

Bekanntes Mitglied
Ich würde deinen Ansatz mit einem Protokoll lösen. Das bei der Erstellung deiner Verbindung, ein String gesendet wird, welches den Pfad darstellt und dann vom Client gespeichert wird und danach die Datei gesendet wird. Natürlich müsstest du es so programmieren, dass dein Client-Protokoll zuerst ein String, danach eine Datei erwartet und somit ist es einfach zu lösen.

Wenn du es über eine zweite Verbindung machen willst, was ich nicht sehr schlecht finde, würde ich auch ein schließen der Verbindung nach dem Senden schon fast empfehlen, weil es auch unnötig ist, eine Verbindung offen zu halten, über die nichts mehr geschieht.
 

Firekill

Mitglied
Hallo zusammen,



ich habe ein kleines Problem. Der Versandt von dateien Funktioniert zwar aber nicht immer (bei mehreren).
Das heißt ab und zu schickt er mir die Datei und wieder nicht.

Ich weiss nicht woran das liegt.

Der Client und der Server haben jeweils ein Empfang und ein Send Methode. (einmal Port 91, einmal Port 92)

Hier der Code vom Server:
Java:
public void dateiEmpfang(String IP) {
                 try {
                     SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress(IP, 92));
                     Socket socket = socketChannel.socket();
                     while (!socket.isClosed()) {
                        try {
                            DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
                            String fileName = dataInputStream.readUTF();
                            int pfad = dataInputStream.readInt();
                            long sizeInBytes = dataInputStream.readLong();
                            File file;
                            if (pfad >= 100000) {
                                pfad = pfad - 100000;
                                file = new File("Daten/eMail/User/" + pfad + "/" + fileName);
                            } else {
                                file = new File("Daten/Stoerung/" + pfad + "/" + fileName);
                            }
                            FileOutputStream fileOutputStream = new FileOutputStream(file);
                            FileChannel fileChannel = fileOutputStream.getChannel();

                            transfer(fileChannel, socketChannel, sizeInBytes,
                                    1024 * 1024 * 16, true, false);

                            fileOutputStream.close();
                        } catch (Exception e) {
                            break;
                        }
                    }
                    socket.close();
                } catch (Exception ex) {
                    FehlerBerichtSchreiben(ex.toString(), "dateiEmpfang (NetzwerkServer)");
                }
            }

Java:
public void dateiVersand(ArrayList<File> datei, ArrayList<String> DateiName, int Gruppe) {
                try {
                    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
                    serverSocketChannel.socket().bind(new InetSocketAddress(91));
                    SocketChannel socketChannel = serverSocketChannel.accept();
                    Socket VergindungsSocket = socketChannel.socket();
                    
                    for (int i = 0; i < datei.size(); i++) {
                        FileInputStream fileInputStream = new FileInputStream(datei.get(i));
                        DataOutputStream dataOutputStream = new DataOutputStream(VergindungsSocket.getOutputStream());
                        dataOutputStream.writeUTF(DateiName.get(i));
                        dataOutputStream.writeInt(Gruppe);
                        dataOutputStream.writeLong(datei.get(i).length());

                        dataOutputStream.flush();

                        FileChannel fileChannel = fileInputStream.getChannel();

                        transfer(fileChannel, socketChannel, datei.get(i).length(), 1024 * 1024 * 16, true, true);

                        fileInputStream.close();
                    }
                    VergindungsSocket.close();
                    socketChannel.close();
                    serverSocketChannel.close();
                } catch (Exception ex) {
                    FehlerBerichtSchreiben(ex.toString(), "dateiVersand (NetzwerkServer)");
                }
            }

Java:
public void transfer(FileChannel fileChannel, SocketChannel socketChannel, long lengthInBytes, long chunckSizeInBytes, boolean verbose, boolean fromFileToSocket)
                    throws IOException {

                long overallBytesTransfered = 0L;
                long time = -System.currentTimeMillis();
                while (overallBytesTransfered < lengthInBytes) {

                    long bytesTransfered = 0L;

                    if (fromFileToSocket) {
                        bytesTransfered = fileChannel.transferTo(overallBytesTransfered, Math.min(
                                chunckSizeInBytes, lengthInBytes
                                - overallBytesTransfered), socketChannel);
                    } else {
                        bytesTransfered = fileChannel.transferFrom(socketChannel,
                                overallBytesTransfered, Math.min(chunckSizeInBytes,
                                lengthInBytes - overallBytesTransfered));
                    }

                    overallBytesTransfered += bytesTransfered;

                    if (verbose) {
                        System.out.printf(
                                "overall bytes transfered: %s progress %s%%\n",
                                overallBytesTransfered, Math.round(overallBytesTransfered
                                / ((double) lengthInBytes) * 100.0));
                    }

                }
                time += System.currentTimeMillis();

                if (verbose) {
                    System.out.printf("Transfered: %s bytes in: %s s -> %s kbytes/s",
                            overallBytesTransfered, time / 1000,
                            (overallBytesTransfered / 1024.0) / (time / 1000.0));
                }

            }

Ich rufe die Empfangsmethode immer bei einer Anfrage die Ich über einanderes Socket (9090) übergebe.

Ich hoffe ihr könnt mir dabei helfen :)

Danke.

Gruss
Manfred Fischer
 
G

Gast2

Gast
Java:
                        } catch (Exception e) {
                            break;
                        }
Jede mögliche Exception die deine empfangs Methode werfen kann verschluckst du einfach und machst stillschweigend weiter. Kein Wunder dass der Fehler schwer zu finden ist, da gehört mindestens mal ein
Code:
e.printStacktrace();
rein.
 

Neue Themen


Oben