使用ObjectOutputStream的writeObject方法时出现套接字写入错误

时间:2014-07-16 19:00:00

标签: 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.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; 
}

1 个答案:

答案 0 :(得分:1)

FTPClient

中有两个问题
  1. 您过早关闭了套接字。在第22行pw.close()需要pw.flush()

  2. 即使您修复了第一个问题,服务器也会挂起。您需要在发送的path字符串末尾添加换行符,以便服务器使用readLine()读取整行;否则它会永远等待一条永不到来的完整线路。

  3. 这在Eclipse中进行调试非常简单。如果你想成为一名优秀的开发人员,调试技巧至关重要。设置多个断点,看看会发生什么。实验。玩。学习。