java - 服务器FTP执行期间eofException

标签 java

当我尝试发送或接收文件时,我不断收到以下错误消息。我试图通过调试找到原因,每次它都停在这一行:

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      

最佳答案

我认为您的 FTP 服务器没有按预期工作。在 GestoreFTP 中,您在接受连接后立即关闭套接字 socket.close();

因此,当您尝试获取此关闭套接字的输入流时,会出现异常。

关于java - 服务器FTP执行期间eofException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42233221/

相关文章:

java - Java Garbage Collect 是否总是必须为 "Stop-the-World"?

java - SpringBoot Junit bean Autowiring

java - 无法从Hive更改表格位置

java - @Spy 在两个列表上注释时不起作用

java - 如何在 Spark Java 中部署

java - 将我的 JMenus 放在自己的类中更好还是全部放在同一个类中更好?

java - 如何根据参数之一对数据结构进行不同的排序?

java - 如何调用 SOAP Web 服务使用带有 SSL 的 httpclient

java - 搜索字符串中的特定字符

java - maven使用spring bootparent创建可执行jar包