Datei über Socket empfangen, TCP-Verbindung friert ein

Ich habe bereits 4 Stunden lang mit den Sockets festgehalten. Ich verwende nur eine Anwendung als Client und Server. Sobald der Client eine Verbindung herstellt, öffnet sich das Fenster mit dem neuen Client.und warten auf Nachricht.

Wenn die Nachricht an den Server gesendet wird, erhält der Client eine Antwort. Dieser Teil funktioniert ohne Probleme.

Teil des Kunden gehört:

while (true)
        {
            InputStreamReader IR = new InputStreamReader(clientSocket.getInputStream());
            BufferedReader BR = new BufferedReader(IR);
            PrintStream PS = new PrintStream(clientSocket.getOutputStream());
            String message = BR.readLine();
            if (message != null)
            {
                System.out.println(clientSocket.getInetAddress() + ":" + clientSocket.getPort() + " has connected."+message);
                if (message.equals("exit"))
                {
                    PS.println("Exiting...");
                    exit();
                }
                else if (message.equals("list"))
                {
                    getList(PS);
                }
                else if ((message.contains("get") && (message.contains(",") && (message.contains(" ")))))
                {
                    String[] spliter = message.split(" ");
                    String[] file = spliter[1].split(",");
                    String file_name = file[0];
                    String file_md5 = file[1];
                    getFile(file_name, file_md5, clientSocket);
                }
            }
            else
            {
                break;
            }

        }

Es gibt 2 Nachrichten, die der Server unterstützt, die erste ist "list" und der Befehl "send one" ist "get with values".

wenn der Client den Befehl "list" anfordert, wird dieser ausgeführt: Es gibt einen "Server / Client", er sendet eine Anfrage und empfängt dasone line string und es funktioniert ohne Probleme, ich erhalte die Liste der Dateien vom Server.

PrintStream PS = new PrintStream(clientSocket.getOutputStream());
        PS.println("list");
        InputStreamReader IR = new InputStreamReader(clientSocket.getInputStream());
        BufferedReader BR = new BufferedReader(IR);
        String lista_plikow = BR.readLine();
        if ( lista_plikow != null)
        {
            return lista_plikow;
        }

Aber ich habe Probleme beim Senden des files über die Sockets mit dem Code, der im Stapelüberlauf gefunden wurde, aber das "Empfan "funktioniert nicht, es gibt meine Empfangsfunktion, die Schleife ist immer 0 (auch wenn die Länge der ersten Bytes korrekt ist), aber die Länge der Bytes ist korrekt, es wird eine neu erstellte Datei verwendet, aber nichts passiert, die Datei ist immer in Gebrauch und hat 0 Bytes anstelle des Inhalts der PS.println.

PrintStream PS = new PrintStream(clientSocket.getOutputStream());
    PS.println("get "+filename+","+file_md5);
    int bytesRead;
    int current = 0;
    FileOutputStream fos = null;
    BufferedOutputStream bos = null;
    try
    {
        byte [] mybytearray  = new byte [Integer.parseInt(size)];
        InputStream is = clientSocket.getInputStream();
        fos = new FileOutputStream(filename + ".recived");
        bos = new BufferedOutputStream(fos);
        bytesRead = is.read(mybytearray,0,mybytearray.length);
        current = bytesRead;
        System.out.println("X" + bytesRead);
        do {
               bytesRead =
                  is.read(mybytearray, current, (mybytearray.length-current));
            System.out.println(bytesRead + " = " + current + " " + (mybytearray.length-current));

               if(bytesRead >= 0) current += bytesRead;
               System.out.println(bytesRead);
        } while(bytesRead > -1);
        bos.write(mybytearray, 0 , current);
        bos.flush();
        System.out.println("File " + "recived." +filename.replace(":", " ")
            + " downloaded (" + current + " bytes read)");
    }catch (Exception e)
    {
        System.out.println(e.getMessage());
    }

Und letzter Teil des Scrips die "PS.println (" get "+ filename +", "+ file_md5);" genau das tut, funktioniert das senden einwandfrei:

FileInputStream fis = null;
            BufferedInputStream bis = null;
            OutputStream os = null;

            String the_file = TorrentAppGui.folder+"\\"+file_name.replace(":", " ");
             File myFile = new File (the_file);
              byte [] mybytearray  = new byte [(int)myFile.length()];
              fis = new FileInputStream(myFile);
              bis = new BufferedInputStream(fis);
              bis.read(mybytearray,0,mybytearray.length);
              os = clientSocket.getOutputStream();
              System.out.println("Sending " + the_file + "(" + mybytearray.length + " bytes)");
              os.write(mybytearray, 0, mybytearray.length);
              os.flush();
              System.out.println("Done.");

Ich habe keine Ahnung, warum ich die vom "@" empfangenen Bytes nicht speichern kanbekomme "befehl, hast du irgendwelche ideen? ich weiß, dass nur die" receve "funktion nicht funktioniert, denn wenn ich mich über telnet in die anwendung einlogge, könnte ich die datei in der konsole bekommen, aber sie erreicht mein ziel nicht Bildschirm von cli.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage