【问题标题】:Transferring files from Client to Server using TCP使用 TCP 将文件从客户端传输到服务器
【发布时间】:2011-07-20 19:18:29
【问题描述】:

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

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

我需要的是:

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

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

感谢

【问题讨论】:

  • 客户端是控制台还是gui应用?您可以使用库还是应该自己编写所有代码?
  • 这是一个控制台应用程序。我需要自己写一切。 :(

标签: java sockets networking tcp client-server


【解决方案1】:

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

  1. 到服务器的每个连接都应该代表一个文件。
  2. 连接发生后,客户端应将文件名作为第一行传递。
  3. 然后客户端应将文件的大小(以字节为单位)作为第二行传递。
  4. 然后客户端应该发送文件的内容。
  5. 最后,应该关闭连接。

现在,您必须为客户端进行编码。您可以使用FileInputStream 读取文件的内容。然后,使用套接字上的OutputBuffer 通过套接字发送元数据和内容。

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

通过第二行,您知道何时完成了套接字。另外,万一套接字死掉或阻塞——无论出于何种原因——你知道传输有问题并且可以中止。

【讨论】:

    【解决方案2】:

    使用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();
    

    【讨论】:

    • 文件只是一个元对象,它不包含文件的内容。他可以将文件名作为字符串发送,而不是序列化整个对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多