• 网络文件传输程序设计(上)


    一、简介

    前几节课学习了TCP套接字(socket),能实现字符串的发送和接收功能,简单地做到了客户机和服务器的对话。我们继续学习TCP套接字,利用它的字节传输技术, 实现网络文件传输
    网络文件传输中用两个TCP端口来实现:

    • 一个端口用来对话,传递控制信息,总是开启
    • 一个端口实现 文件数据传递服务 ,有数据传输服务时开启
      在这里插入图片描述
      网络对话和网络文件传输,使用TCP的socket编程,本质还是一样,对话过程,使用字符流来包装;而网络文件传输过程,则应该使用字节流来进行处理。

    基于C/S的主要程序结构如下:
    在这里插入图片描述
    客户端发送对话信息给2021服务器,服务器接收对话信息,并回话。客户端向2020服务器发送文件名,服务器接收数据文件。

    客户端程序:

    • 主界面客户端程序FileClientFX.java;
    • 文件对话客户端程序(控制进程)FileDialogClient.java;
    • 文件数据客户端程序(数据传输进程)FileDataClient.java。

    服务端程序:

    • 文件对话服务器程序FileDialogServer.java,开启2021端口(身份验证、文件目录传送)
    • 文件数据服务器程序FileDataServer.java,开启2020端口(传送文件名,接收文件)

    二、创建客户端远程文件对话程序(FileDialogClient.java)

    主要功能:发送用户信息、实现和文件服务器的基本对话,文件浏览和下载

    客户端发生信息后,所收到的信息与交互,和服务端的程序编写有关,客户端无法控制

    其中:

    • 发送 dir 显示文件列表
    • 发送 help 显示帮助信息
    • bye表示退出
    • 发送文件名,服务器会回馈文件名是否正确、能否下载
    • 根据提示使用“下载”按钮完成下载动作

    三、创建客户端数据传送进程(FileDataClient.java)

    主要功能:连接服务器数据端口、发送文件名、保存下载的文件,文件传输完成后关闭数据连接。

    该程序有2个方法:

    • 构造方法,FileDataClient(String ip, String port),向服务器的数据端口请求连接
    • 文件下载方法,getFile(fileName)

    1、构造方法代码

     //  构造方法代码:向服务器数据端口请求连接
        FileDataClient(String ip, String port) throws IOException {
            try {
                dataSocket = new Socket(ip, Integer.parseInt(port));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    2、文件下载方法

    public void getFile(File saveFile) throws IOException {
    
      if (dataSocket != null) { // dataSocket是Socket类型的成员变量
        FileOutputStream fileOut = new FileOutputStream(saveFile);//新建本地空文件
        byte[] buf = new byte[1024]; // 用来缓存接收的字节数据
        //网络字节输入流
        InputStream socketIn = dataSocket.getInputStream();
        //网络字节输出流
        OutputStream socketOut = dataSocket.getOutputStream();
    
        //(2)向服务器发送请求的文件名,字符串读写功能
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(socketOut, "utf-8"), true);
        pw.println(saveFile.getName());
    
        //(3)接收服务器的数据文件,字节读写功能
        int size = 0;
        while ((size = socketIn.read(buf)) != -1) {//读一块到缓存,读取结束返回-1
          fileOut.write(buf, 0, size); //写一块到文件
        }
        fileOut.flush();//关闭前将缓存的数据全部推出
        //文件传输完毕,关闭流
        fileOut.close();
        if (dataSocket != null) {
          dataSocket.close();
        }
      } else {
        System.err.println("连接ftp数据服务器失败");
      }
    }
    

    四、实验过程

    1. 启动客户端FileClientFX.java程序,连接xxx.xxx.xxx.xx : xxxx服务器,关注提示信息,根据提示信息操作;
      在这里插入图片描述
    2. 根据信息显示区的文件列表,在信息输入区输入要下载文件的全名(如果实现了扩展练习要求的快捷功能,可以使用鼠标拖动加亮式),使用“发送”按钮发送此文件名,服务器会给出相应反馈提示信息;
    3. 在信息输入区输入要下载文件的全名(如果实现了扩展练习要求的快捷功能,可以使用鼠标拖动加亮方式),点击“下载”按钮从服务器下载文件
    4. 运行下载的jar文件(双击,或控制台使用java -jar 文件名),运行成功。由于我的idea不是2018版,使用java -jar文件名运行。
      请添加图片描述
  • 相关阅读:
    ChatGPT与日本首相交流核废水事件-精准Prompt...
    golang同步原语——sync.Mutex
    java计算机毕业设计计算机组成原理教学网站源码+mysql数据库+系统+lw文档+部署
    vue2组件之间传值方式,父子,子父,兄弟,v-model ,provide和inject,$parent和$children
    Lit(六):内置指令、自定义指令
    LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统
    BUUCTF test_your_nc
    Anaconda的安装
    Dockerfile 修改文件角色容量变大
    【Linux】基础IO —— 深入理解文件系统 | 软硬链接
  • 原文地址:https://blog.csdn.net/weixin_51293984/article/details/126955907