【问题标题】:Socket write error while using ObjectOutputStream's writeObject method使用 ObjectOutputStream 的 writeObject 方法时发生套接字写入错误
【发布时间】:2014-07-16 18:59:59
【问题描述】:

我正在尝试使用 java 中的套接字编程来实现 FTP 协议。我正在使用 ObjectOutputStream 将请求的数据写入服务器端的套接字,但我在控制台窗口上收到以下错误..

软件导致连接中止:socket write error

这是我的程序的实现 服务器端:

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; 
}

【问题讨论】:

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

标签: java sockets ftp client-server


【解决方案1】:

FTPClient你有两个问题

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

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

这在 Eclipse 中调试起来很简单。如果您想成为一名优秀的开发人员,调试技能至关重要。设置多个断点,看看会发生什么。实验。玩。学习。

【讨论】:

    猜你喜欢
    • 2014-04-16
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多