Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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 UDP文件传输应用程序_Java_File_Udp_Client Server - Fatal编程技术网

Java UDP文件传输应用程序

Java UDP文件传输应用程序,java,file,udp,client-server,Java,File,Udp,Client Server,我试图用Java创建一个简单的UDP文件传输应用程序(服务器和客户端),但我几乎没有这方面的经验,仍然在学习一些基础知识。例如,我已经设法制作了一个功能性应用程序,它将选择的文件从我的笔记本电脑发送到我的桌面,但使用TCP 本质上,我想做的是一个应用程序,在这个应用程序中,您可以选择一个选项来列出服务器上的文件(一个特定的默认文件夹,在本例中为C:\Sharefolder),一个选项将文件上载到服务器,以及另一个选项从服务器下载文件。我如何在客户端的方法方面做到这一点 这是我到目前为止为客户提供

我试图用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();
公共类客户端{
专用最终静态int PACKETSIZE=100;
公共静态无效上载(字符串ipadd、字符串iport、字符串fname){
DatagramSocket套接字=空;
试一试{
InetAddress主机=InetAddress.getByName(ipadd);
int port=Integer.parseInt(iport);
套接字=新的DatagramSocket(端口、主机);
File File=新文件(“C:\\Sharefolder\\”+fname);
long size=file.length();
如果(大小>整数最大值){
System.out.println(“文件太大”);
}
字节[]字节=新字节[(int)大小];
对于(int i=0;i 0){
out.write(字节,0,计数);
}
out.flush();
out.close();
fis.close();
二、关闭();
socket.close();

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

我不理解
的要求,请在客户机的方法方面这样做
。在高层次上,您将拥有您的操作定义的方法(a
列表文件(路径)
,一个
上传文件(localPath,remotePath)
和一个
下载文件(localPath,remotePath)

问题是UDP不可靠,因此您必须控制数据的真实来源

关于您需要什么的一些提示:

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

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

3) 当您接收/发送文件时,它将分为多个数据块(数据报最大有效负载为64K,除非您使用IPv6)。控制顺序,检查是否所有文件都到达,请求返回未到达的文件

4) 玩得开心


这比使用TCP要复杂得多,因为您必须控制TCP为您控制但可以完成的许多事情。因为您没有提到这些限制,我会与分配给您的人员一起检查限制(您可以使用IPv6吗?通过的最大文件大小是多少?)

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

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

如果我可以问的话,为什么要使用UDP?这是我任务的一部分,它应该使用Datagrams。如果你想支持多个操作,你需要想出某种命令方案。客户端需要告诉服务器它正在尝试做什么,然后根据命令使用某些数据。因此,如果我告诉你,我想这样做列出一个目录,接下来我应该告诉你的是一个目录。祝你好运!谢谢你的回复!我已经有了一个基本的菜单,可以根据命令调用客户端类上的正确方法(上传、下载等)。但是,这是否也需要我在服务器端使用其他方法呢?我想不会,不过我只是想问一下,因为我对任何涉及互联网通信的java都没有经验。谢谢,我已经做了一些变通,我想我会使用TCP而不是UDP,这主要是因为时间限制,但也因为可靠性。我在这里发布了另一个关于我当前服务器代码的问题:)