Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ObjectOutputStream';s writeObject方法_Java_Sockets_Ftp_Client Server - Fatal编程技术网

Java 使用ObjectOutputStream';s writeObject方法

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

我试图用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; 
}

FTPClient

  • 您过早地关闭了套接字。第22行的
    pw.close()
    需要
    pw.flush()

  • 即使解决了第一个问题,服务器也会挂起。您需要在发送的
    路径
    字符串的末尾添加一个换行符,以便服务器可以使用
    readLine()
    读取整行内容;否则,它将永远等待一条永远不会到达的完整线路


  • 这对于在Eclipse中调试来说是微不足道的。如果您想成为一名优秀的开发人员,调试技能至关重要。设置多个断点,看看会发生什么。实验。玩了解。

    您是否尝试过在调试器中运行此功能?如果没有,从那里开始。@JimGarrison我没有使用调试器的经验,虽然我尝试过,但调试器在创建ObjectOutputStream对象和调用writeObject方法时通过了设置的断点,没有任何错误。请help@JimGarrison我无法找到问题,请至少给我一个提示。您的代码不够完整,任何人都无法调试它。什么是
    FileInstance
    ?@JimGarrison我已经更新了这个问题。。。