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

一、简介

前几节课学习了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文件名运行。
    请添加图片描述
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值