2017-02-14 59 views
1

當我嘗試發送或接收文件時,我不斷收到此錯誤寫在下面。我試圖找到與調試每次停在這行時間的原因和:服務器執行期間eofexception FTP

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

這些是出現在運行後,我進入了鍵盤文件的路徑錯誤:

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) 

類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發送名稱,而不是內容。您必須打開文件,並將其內容讀寫到socket。
  3. 序列化不是FTP。

你需要擺脫所有這一切,並使用輸入&輸出蒸汽的一切。要麼實現實際的FTP協議,要麼設計你自己的。但不是這樣。