Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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 TCP文件传输应用程序_Java_File_Tcp_Udp_Client Server - Fatal编程技术网

Java TCP文件传输应用程序

Java TCP文件传输应用程序,java,file,tcp,udp,client-server,Java,File,Tcp,Udp,Client Server,您好,提前感谢您抽出时间阅读。我正在尝试使用TCP开发一个简单的Java文件传输应用程序。到目前为止,使用我的客户机和服务器类,我已经设法添加了一个工作上传方法(将文件上传到服务器运行的计算机) 我还没有这方面的经验,所以我会慢慢来。我还需要添加一个下载选项(从服务器获取文件),列出服务器上的所有文件,以及一个允许我从服务器上删除任何文件的选项 public static boolean send(FileInputStream fis,OutputStream os) throws IOExc

您好,提前感谢您抽出时间阅读。我正在尝试使用TCP开发一个简单的Java文件传输应用程序。到目前为止,使用我的客户机和服务器类,我已经设法添加了一个工作上传方法(将文件上传到服务器运行的计算机)

我还没有这方面的经验,所以我会慢慢来。我还需要添加一个下载选项(从服务器获取文件),列出服务器上的所有文件,以及一个允许我从服务器上删除任何文件的选项

public static boolean send(FileInputStream fis,OutputStream os) throws IOException, InterruptedException
{
    Thread.currentThread().sleep(1000);
     while(true)
        {
            int read=0;
        if(fis!=null)
            read=fis.read(buf);
        byte[] result=new byte[read];
        //System.out.println(read);
        // os.write(buf,0,read);

         System.arraycopy(buf, 0, result,0, read);
            os.write(result);
            if(read < BUFFER_SIZE)
            {
                //System.out.println("服务器向客户端发送read="+read);
            break;
            }
        }//while
    fis.close();    
    return true;
}
对于服务器和客户端,我都使用特定的默认文件夹(在本例中为C:/Sharedfolder)。目前我的问题是:

  • 在我当前的服务器代码中,上载到它的文件被重命名为“newfile”。如何将文件名更改为“oldfile\u new”(实际原始文件名是oldfile)
  • 使用下面我当前的服务器代码,我可以创建一个客户端类,用于从将使用它的服务器下载文件吗?我该怎么做?上传部分对我来说是有意义的,但我仍在试图找出从服务器下载/列出的文件
  • 我目前正在使用一个预定义的主机IP,但我最终需要修改应用程序,以便客户端发送UDP广播来查找专用网络上的服务器。有人能告诉我怎么做吗
  • 我当前的服务器代码如下:

    public class Server {
    
    public static void main(String[] args) throws IOException {
    
        ServerSocket serverSocket = null;
    
        try {
            serverSocket = new ServerSocket(4555);
        } catch (IOException ex) {
            System.out.println("Can't setup server on this port number.\n");
        }
    
        Socket socket = null;
        InputStream is = null;
        OutputStream fos = null;
        BufferedOutputStream bos = null;
        int bufferSize = 0;
        System.out.println("Ready...");
    
        try {
            socket = serverSocket.accept();
        } catch (IOException ex) {
            System.out.println("Can't accept client connection.\n");
        }
    
        try {
            is = socket.getInputStream();
    
            bufferSize = socket.getReceiveBufferSize();
            System.out.println("Buffer size: " + bufferSize);
        } catch (IOException ex) {
            System.out.println("Can't get socket input stream.\n");
        }
    
        try {
            fos = new FileOutputStream("C:\\Sharedfolder\\newfile");
            bos = new BufferedOutputStream(fos);
    
        } catch (FileNotFoundException ex) {
            System.out.println("File not found.\n");
        }
    
        byte[] bytes = new byte[bufferSize];
    
        int count;
    
        while ((count = is.read(bytes)) > 0) {
            bos.write(bytes, 0, count);
        }
    
        bos.flush();
        bos.close();
        is.close();
        socket.close();
        serverSocket.close();
    
    }
    
    }


    任何帮助都将不胜感激。谢谢:)

    已经有很多工具可以做到这一点,但这是一个很好的学习练习

    通常,您不仅需要传输数据,还需要传输有关文件本身的一些信息:

  • 将文件名从服务器发送到客户端
  • 将文件大小从服务器发送到客户端
  • 将文件的数据发送到客户端。客户端可以使用步骤中收到的大小来计算进度
  • 将文件的修改时间从服务器发送到客户端。客户机在收到的文件上加盖mod时间戳

  • 所有这些东西都可以通过您已实例化的流对象发送,您只需确保客户端/服务器之间的事件顺序正确。

    我曾经使用java使用加密、证书构建客户端-服务器安全的文件传输通道。因此,也许我可以给您一些帮助

    问题1:要从客户端获取文件名,必须在传输文件数据之前将文件名传输到服务器

    问题2:要从服务器下载文件,您必须向服务器发出信号(文件下载/上传请求),告诉它是下载还是上传操作,看起来很像ftp协议。这样的信号应该预先传输到服务器端。因此,您必须打开与服务器端相同的套接字,用于从服务器获取文件的inputStream

    public static boolean send(FileInputStream fis,OutputStream os) throws IOException, InterruptedException
    {
        Thread.currentThread().sleep(1000);
         while(true)
            {
                int read=0;
            if(fis!=null)
                read=fis.read(buf);
            byte[] result=new byte[read];
            //System.out.println(read);
            // os.write(buf,0,read);
    
             System.arraycopy(buf, 0, result,0, read);
                os.write(result);
                if(read < BUFFER_SIZE)
                {
                    //System.out.println("服务器向客户端发送read="+read);
                break;
                }
            }//while
        fis.close();    
        return true;
    }
    
    问题3:您应该将ip地址、端口号和协议类型(TCP/UDP)设置为主函数的参数。因此,您可以只设置参数,而不修改源代码,以使应用程序按您想要的方向运行


    这正是我所知道的。希望它能给你一些帮助。

    如果你已经在读/写大字节[],你不需要使用BufferedInput/OutputStream。下载和上传是一样的,唯一的区别是哪一端在发送,哪一端在接收。代码基本相同,谢谢回复。下载部分需要我向服务器类添加一些东西吗?还是只在客户端进行更改?让我困惑的是服务器是在后台运行的。客户端和服务器之间唯一的区别是谁创建了连接,然后你有一个两端看起来都一样的套接字。我建议您提取发送文件的代码和接收文件的另一种方法。区别在于服务器将发送而不是客户端,客户端将接收而不是发送。进程在后台运行这一事实不应该有任何区别。客户端也可能在后台。是的,我的问题是(如果这太明显了,我很抱歉,尽管我仍在努力理解),如何让服务器知道我想通过客户端从中获取文件。发送请求时,服务器如何知道我正在向其请求文件?因为至少在我看来,当前的代码只允许服务器接收文件。这是一个编程练习吗?ssh/scp、sftp、rsync等呢?所有这些协议都有客户机和服务器的Java实现。除非所有经过良好测试的免费实现都不适合您,否则没有理由重新发明这个轮子。