Java 使用ObjectOutputStream';s writeObject方法
我试图用java中的套接字编程实现FTP协议。我正在使用ObjectOutputStream将请求的数据写入服务器端的套接字,但在控制台窗口上出现以下错误 软件导致的连接中止:套接字写入错误 这是我的程序的实现 服务器端:Java 使用ObjectOutputStream';s writeObject方法,java,sockets,ftp,client-server,Java,Sockets,Ftp,Client Server,我试图用java中的套接字编程实现FTP协议。我正在使用ObjectOutputStream将请求的数据写入服务器端的套接字,但在控制台窗口上出现以下错误 软件导致的连接中止:套接字写入错误 这是我的程序的实现 服务器端: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class FTPServer {
public static void main(String[] args) {
try {
@SuppressWarnings("resource")
ServerSocket ss = new ServerSocket(4550);
while(true) {
Socket socket = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
FileInstance file = new FileInstance();
System.out.println(file.srcDir = br.readLine());
System.out.println(file.destDir = br.readLine());
System.out.println(file.filename = file.srcDir.substring(file.srcDir.lastIndexOf("/") + 1));
File f = new File(file.srcDir);
byte[] bytes = new byte[(int)f.length()];
FileInputStream fis = new FileInputStream(f);
fis.read(bytes);
file.FILE_SIZE = bytes.length;
file.fileData = bytes;
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(file);
System.out.println("Success");
oos.close();
fis.close();
br.close();
}
} catch(IOException e) {
System.out.println(e.getMessage());
}
}
}
客户端:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class FTPClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 4550);
BufferedReader sbr = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter the path of requested file");
String path = sbr.readLine();
System.out.println(path);
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
System.out.println("Enter Destination");
path = path + "\n" + sbr.readLine();
System.out.println(path);
pw.write(path);
pw.close();
sbr.close();
// receive file
ObjectInputStream ois= new ObjectInputStream(socket.getInputStream());
FileInstance file = (FileInstance)ois.readObject();
ois.close();
if(!new File(file.destDir).exists())
new File(file.destDir).mkdir();
File nfile = new File(file.destDir + "/" + file.filename);
FileOutputStream fos = new FileOutputStream(nfile);
fos.write(file.fileData);
fos.close();
socket.close();
System.out.println("Success");
} catch(IOException e) {
System.out.println(e.getMessage());
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
}
}
这是FileInstance类
import java.io.Serializable;
public class FileInstance implements Serializable {
private static final long serialVersionUID = 1L;
public String destDir;
public String srcDir;
public String filename;
public long FILE_SIZE;
public byte[] fileData;
public String status;
}
FTPClient
pw.close()
需要pw.flush()
路径
字符串的末尾添加一个换行符,以便服务器可以使用readLine()
读取整行内容;否则,它将永远等待一条永远不会到达的完整线路这对于在Eclipse中调试来说是微不足道的。如果您想成为一名优秀的开发人员,调试技能至关重要。设置多个断点,看看会发生什么。实验。玩了解。您是否尝试过在调试器中运行此功能?如果没有,从那里开始。@JimGarrison我没有使用调试器的经验,虽然我尝试过,但调试器在创建ObjectOutputStream对象和调用writeObject方法时通过了设置的断点,没有任何错误。请help@JimGarrison我无法找到问题,请至少给我一个提示。您的代码不够完整,任何人都无法调试它。什么是
FileInstance
?@JimGarrison我已经更新了这个问题。。。