使用TCP将文件从客户端传输到服务器

时间:2011-07-20 19:18:30

标签: java sockets networking tcp client-server

大家好,我正在做一个学校项目,我需要建立一个 TCP 服务器/客户端,使用TCP协议将文件从客户端传输到服务器。

我已经知道如何让 TCP 服务器和客户端发送消息和对象。

  

我需要的是:

  1. 用户从预定义目录中选择文件
  2. 然后他可以输入send-file.ext将文件发送到服务器 服务器需要
  3. 从客户端
  4. 获取文件
  5. 将文件保存在预定义目录中
  6.   

    我该如何解决这个问题?如果我从用户硬盘驱动器获取文件,我如何将该文件转换为字节,然后发送到服务器。   服务器如何知道它是一个文件并用原始名称保存文件?

    感谢名单

2 个答案:

答案 0 :(得分:1)

您需要做的第一件事是定义协议。例如......

  1. 与服务器的每个连接都应代表一个文件。
  2. 连接发生后,客户端应将文件名作为第一行传递。
  3. 然后客户端应该传递文件的大小(以字节为单位)作为第二行。
  4. 然后客户端应该发送文件的内容。
  5. 最后,应该关闭连接。
  6. 现在,您必须为客户端进行编码。您可以使用FileInputStream读取文件的内容。然后,使用套接字上的OutputBuffer通过套接字发送元数据和内容。

    最后,服务器。无论何时客户端连接,您都知道前两行是什么。因此,请在第一行中读取并根据文件名创建一个新文件。然后,在第二行阅读。最后,来自套接字的read X number of byteswrite those bytes to the file,其中X是第二行的字节大小。

    通过使用第二行,您知道何时完成套接字。此外,如果插座死亡或阻塞 - 无论出于何种原因 - 您知道转移有问题并且可以中止。

答案 1 :(得分:-1)

使用ObjectOutputStream通过套接字和File.getName发送文件实例以获取文件名。文件为Serializable,因此您无需将实例转换为字节。有关更多帮助,请参阅this示例。

//client
    String filename = "";
    File f = new File(filename);
    Socket sock = new Socket();
    ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());
    oos.writeObject( f );

    //server
    ObjectInputStream ois = new ObjectInputStream(sock.getInputStream());
    File f = (File)ois.readObject();
    String filename = f.getName();