2017-02-14 17 views
1

ファイルを送受信しようとすると、このエラーが発生し続けます。私は、デバッグとの理由、それは、このライン上で停止するたびに見つけることを試みた:サーバの実行中にeofexceptionが発生するFTP

java.io.EOFException 
    at java.io.ObjectInputStream$PeekInputStream.readFully (ObjectInputStream.java:2353) 
    at java.io.ObjectInputStream$BlockDataInputStream.readShort (ObjectInputStream.java:2822) 
    at java.io.ObjectInputStream.readStreamHeader (ObjectInputStream.java:804) 
    at java.io.ObjectInputStream. <init> (ObjectInputStream.java:301) 
    at ClientFTP.riceviFile (ClientFTP.java:101) 
    at ClientFTP.main (ClientFTP.java:44) 

クラス:私はキーボードファイルのパスを入力した後

ObjectInputStream Inputs = new ObjectInputStream (socket.getInputStream()); 

は、これらが稼働して表示されるエラーですServerFTP

import java.io.*; 
import java.net.*; 
import java.util.Scanner; 

public class ServerFTP { 

    private final int PORTA=2000; 
    public static void main(String[] args) { 
     ServerFTP server = new ServerFTP(); 
     try { 
      server.listen(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      } 

    } 

    // Metodo per l'ascolto sulla porta predisposta 

    private void listen() throws IOException { 
     ServerSocket server = new ServerSocket(PORTA); 
     System.out.println("Server FTP in ascolto ...."); 

     // ciclo infinito per accettare connessioni 
     do { 
      Socket connessione = server.accept(); // accetto connessioni in ingresso 
      GestoreFTP gestore = new GestoreFTP(connessione); 
      gestore.run(); 
      // inserisco un ritardo per il main 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e){} 
     } while (true); 
    } 

} 

クラスGestoreFTP

import java.io.*; 
import java.net.*; 
import java.util.Scanner; 

public class GestoreFTP implements Runnable{ 
    private final String DIRECTORY="C:\\ciao"; 
    private Socket socket; 
    private Scanner input; 
    PrintWriter output = null; 
    private int opzione; 

    public GestoreFTP(Socket socket){ 
     this.socket=socket; 
     try { 
      input = new Scanner(socket.getInputStream()); 
      output = new PrintWriter(socket.getOutputStream(),true); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     opzione=input.nextInt(); 
    } 

    public void run(){ 
     if (opzione==1){ 
      try { 
       System.out.println("Richiesto trasferimento file da: "+socket); 

       // intercetto lo stream di input 
       ObjectInputStream inputS= new ObjectInputStream(socket.getInputStream()); 
       // eseguo un cast in file 
       File inputFile = (File) inputS.readObject(); 
       // estraggo il nome del file ricevuto 
       // e predispongo un file di output 
       File outputFile = new File(DIRECTORY+"\\"+inputFile.getName()); 
       // eseguo il salvataggio sul Server 
       salvaFile(inputFile, outputFile); 
      } catch (Exception e){ 
       e.printStackTrace(); 
       } 
     } 
     else { 
      try{ 
       File fileDir = new File(DIRECTORY); 
       String[] fileList = fileDir.list(); 
       for (int i=0;i<fileList.length;i++) 
        output.println(fileList[i]+"\n"); 
       String fileDaInviare=input.nextLine(); 
       File file=new File(fileDaInviare); 
       inviaFile(file); 
      } catch (Exception e){} 
     } 
     try { 
      socket.close(); 
     } catch (IOException e){} 
    } 

    private void salvaFile(File in, File out) throws IOException{ 
     System.out.println("Ricezione file "+in.getName()+" in corso..."); 
     System.out.println("Dimensione file "+in.getName()+": "+in.length()+" byte"); 
     // Apertura stream di input sul file inviato 
     FileInputStream inS = new FileInputStream(in); 
     // Apertura stream di output per salvare il nuovo file 
     FileOutputStream outS = new FileOutputStream(out); 
     // buffer per contenere una riga del file 
     byte [] buffer = new byte[1024]; 
     // leggo una riga per volta e scrivo nel file destinazione 
     int i; 
     while((i=inS.read(buffer))!=-1){ 
      outS.write(buffer); 
     } 
     // chiudo gli stream 
     inS.close(); 
     outS.close(); 
     System.out.println("...Trasferimento completato!"); 
    } 

    private void inviaFile(File file) throws IOException{ 
     ObjectOutputStream outS= new ObjectOutputStream(socket.getOutputStream()); 
     outS.reset(); 
     outS.writeObject(file); 
     outS.flush(); 
     outS.close(); 
    } 

} 

クラスClientFTP

import java.io.*; 
import java.net.*; 
import java.util.*; 

public class ClientFTP { 
    private final String SERVER="127.0.0.1"; 
    private final String DIRECTORY="C:\\lavoro\\lodi"; 
    private final int PORTA=2000; 
    private static int opzione; 

    public static void main(String[] args) { 
     String path=""; 
     ClientFTP client= new ClientFTP(); 
     Scanner scelta=new Scanner(System.in); 
     do{ 
      System.out.println("Scegli un'opzione:"); 
      System.out.println("1)invia file;"); 
      System.out.println("2)ricevi file"); 
      opzione=scelta.nextInt(); 
     }while (opzione!=1&&opzione!=2); 
     //menu 
     //invia 
     if (opzione==1){ 
      try { 
       File file; 
       // immissione percorso e nome file 
       System.out.println("Inserire il path completo (Es.: C:/prova/prova.txt): "); 
       Scanner tastiera = new Scanner(System.in); 
       try { 
        path=tastiera.nextLine(); 
        tastiera.close(); 
       } catch (InputMismatchException e){ 
        System.err.println(e); 
       } 
       file=new File(path); 
       client.inviaFile(file); 
      } catch (IOException e){ 
       e.printStackTrace(); 
      } 
     } 
     //ricevi 
     else if (opzione==2){ 
      try { 
       client.riceviFile(); 
      } catch (IOException e){ 
       e.printStackTrace(); 
      } 
     } 
    }// main 

    private void inviaFile(File file) throws IOException{ 
     Socket socket=null; 
     PrintWriter output=null; 
     try { 
      socket=new Socket(SERVER, PORTA); 
      output = new PrintWriter(socket.getOutputStream(),true); 
     } catch(UnknownHostException e){ 
      e.printStackTrace(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } 
     output.println(1); 
     ObjectOutputStream outS= new ObjectOutputStream(socket.getOutputStream()); 
     outS.reset(); 
     outS.writeObject(file); 
     outS.flush(); 
     outS.close(); 
    } 

    private void riceviFile() throws IOException{ 
     Socket socket=null; 
     PrintWriter output=null; 
     Scanner input=null; 
     Scanner fileDaScegliere=null; 
     try { 
      socket=new Socket(SERVER, PORTA); 
      input = new Scanner(socket.getInputStream()); 
      output = new PrintWriter(socket.getOutputStream(),true); 
     } catch(UnknownHostException e){ 
      e.printStackTrace(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } 
     output.println(2); 
     //stampa il contenuto della cartella nel server 
     stampa(input); 
     //scelgo il file da prendere 
     System.out.println("Inserire il path completo (Es.: C:/prova/prova.txt): "); 
     fileDaScegliere = new Scanner(System.in); 
     String path=null; 
     try { 
      path=fileDaScegliere.nextLine(); 
      fileDaScegliere.close(); 
     } catch (InputMismatchException e){ 
      System.err.println(e); 
     } 
     //invio il percorso 
     output.println(path); 
     // intercetto lo stream di input 
     try{ 
      ObjectInputStream inputS= new ObjectInputStream(socket.getInputStream()); 
      // eseguo un cast in file 
      File inputFile = (File) inputS.readObject(); 
      // estraggo il nome del file ricevuto 
      // e predispongo un file di output 
      File outputFile = new File(DIRECTORY+"\\"+inputFile.getName()); 
      // eseguo il salvataggio sul Server 
      salvaFile(inputFile, outputFile); 
     }catch (Exception e){ 
      e.printStackTrace(); 
      } 
    } 

    private void stampa(Scanner input){ 
     Scanner ricezione=null; 
     ricezione=input; 
     String risposta; 
     while(input.hasNextLine()){ 
      try { 
       risposta = input.nextLine(); // passo 3 
       System.out.println(risposta); 
      }catch (Exception e){} 
     } 
    } 

    private void salvaFile(File in, File out) throws IOException{ 
     System.out.println("Ricezione file "+in.getName()+" in corso..."); 
     System.out.println("Dimensione file "+in.getName()+": "+in.length()+" byte"); 
     // Apertura stream di input sul file inviato 
     FileInputStream inS = new FileInputStream(in); 
     // Apertura stream di output per salvare il nuovo file 
     FileOutputStream outS = new FileOutputStream(out); 
     // buffer per contenere una riga del file 
     byte [] buffer = new byte[1024]; 
     // leggo una riga per volta e scrivo nel file destinazione 
     int i; 
     while((i=inS.read(buffer))!=-1){ 
      outS.write(buffer); 
     } 
     // chiudo gli stream 
     inS.close(); 
     outS.close(); 
     System.out.println("...Trasferimento completato!"); 
    } 
} // class  

答えて

0

私は期待のようなあなたのFTPSERVERが動作しないと思います。 GestoreFTPでは、接続を受け入れた直後にソケットsocket.close();を閉じます。

この閉じたソケットの入力ストリームを取得しようとすると例外があります。

0
  1. リーダとライターとオブジェクトストリームを同じソケットに混在させることはできません。
  2. シリアル化を使用してFileを送信すると、コンテンツではなく名前が送信されます。ファイルを開いて、その内容をソケットに読み書きする必要があります。
  3. シリアル化はFTPではありません。

これをすべて取り除き、すべての入力蒸気を&入力する必要があります。実際のFTPプロトコルを実装するか、独自の方法を考案してください。しかし、そうではありません。

関連する問題