【问题标题】:Java UDP file transfer applicationJava UDP 文件传输应用程序
【发布时间】:2013-06-15 12:33:58
【问题描述】:

我正在尝试在 Java 中创建一个简单的 UDP 文件传输应用程序(服务器和客户端),但我几乎没有这方面的经验,仍在学习一些基础知识。例如,我设法制作了一个功能性应用程序,可以将选定的文件从我的笔记本电脑发送到我的桌面,但使用 TCP。

基本上,我想做的是一个应用程序,您可以在其中选择一个选项来列出服务器上的文件(特定的默认文件夹,在本例中为 C:\Sharefolder),一个将文件上传到服务器的选项,以及从服务器下载文件的另一个选项。就客户端中的方法而言,我该如何做到这一点?

这是我迄今为止为客户提供的代码,我不知道我是否朝着正确的方向前进。我在底部区域还有一些旧的 TCP 程序代码,所以没关系。

public class Client {

private final static int PACKETSIZE = 100 ;

public static void upload(String ipadd, String iport, String fname) {

    DatagramSocket socket = null ;

    try {
        InetAddress host = InetAddress.getByName(ipadd);
        int port = Integer.parseInt(iport);

        socket = new DatagramSocket(port, host) ;

        File file = new File("C:\\Sharefolder\\" +fname);
        long size = file.length();
        if (size > Integer.MAX_VALUE) {
            System.out.println("File too big");
        }
        byte[] bytes = new byte[(int) size];
        for(int i=0; i<size; i++) {
            //Send file bytes to a byte array?
        }

        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, host, port ) ;


        byte[] bytes = new byte[(int) size];
        FileInputStream fis = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(fis);
        BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());

        int count;

        while ((count = bis.read(bytes)) > 0) {
            out.write(bytes, 0, count);
        }

        out.flush();
        out.close();
        fis.close();
        bis.close();
        socket.close();

如果有人能指出任何可以帮助我检查我应该在我的代码上做什么的方向,那将不胜感激。谢谢!

【问题讨论】:

  • 为什么是 UDP,如果我可以问的话?
  • 这是我的任务的一部分,它应该使用数据报
  • 如果你想支持多个动作,你需要想出某种命令方案。客户端需要告诉服务器它正在尝试做什么,然后根据命令跟随某些数据。所以如果我告诉你我想列出一个目录,接下来我应该告诉你的是一个目录。祝你好运!
  • 感谢您的回复!我已经有一个基本菜单,根据命令将调用客户端类上的正确方法(上传、下载等)。但是,这是否需要我在服务器端也采用其他方法?我想不是,虽然我只是问,因为我对任何涉及互联网通信的 java 真的没有经验。

标签: java file udp client-server


【解决方案1】:

我不明白do this in terms of method in the client的要求。在高层次上,您将拥有操作定义的方法(listFiles(path)uploadFile(localPath, remotePath)downloadFile(localPath, remotePath))。

问题在于 UDP 不可靠,因此您必须控制数据是否真正到来。

您需要的一些提示:

1)一个描述你的内容格式的迷你协议(每个命令命令的消息,如何传递参数/数据)等。

2) 消息发送后,您需要设置超时并(如果没有收到回复)再次发送消息。

3) 当您接收/发送文件时,它将分成几个块(数据报最大有效负载为 64K,除非您使用 IPv6)。控制订单,检查是否都到了,没有到的请退回。

4) 玩得开心!

它比 TCP 复杂得多,因为你必须控制 TCP 为你控制的很多事情,但可以做到。由于您没有提及它们,因此我会与给您分配任务的人检查限制(您可以使用 IPv6 吗?通过所需的最大文件大小是多少?)

【讨论】:

  • 谢谢,我已经做了一些解决方法,我想我应该只使用 TCP 而不是 UDP,主要是因为时间限制,但也有可靠性。我已经在这里发布了另一个问题,其中包含我当前的服务器代码关于我的问题:)
【解决方案2】:

这个编程作业是让你设计一个简单的文件传输协议,它是一个应用层协议。但与 FTP 不同,您必须使用 UDP 作为底层传输协议。如果你想让它有点健壮,我认为你可能需要解决以下问题:

  • UDP协议是不可靠协议;它不能保证所有数据包都按顺序交付和交付。因此,您必须在应用程序级别实施自己的完整性检查。完整性检查可以是 SHA-1。在发送块之前,您指定该块的长度和 SHA-1 并将它们包含在您的协议消息头中。所以接收者能够检查元信息。如果不匹配,发送方必须重新传输前一个块。
  • 关于协议,您可以设计一个基于文本的协议。基于文本的协议包含协议状态行、正文和内容。每行以“\r\n”结束,每一部分以“\r\n”结束。类似于 HTTP 协议。状态行表示您的命令 - 列表、上传、加载,正文表示序列号、长度、SHA-1 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多