gpt4 book ai didi

java - 服务器FTP执行期间eofException

转载 作者:太空宇宙 更新时间:2023-11-04 11:47:15 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com