编写Java程序,实现客户端向服务端上传文件的功能

简介: 编写Java程序,实现客户端向服务端上传文件的功能

需求说明:


实现客户端向服务端上传文件的功能

当启动服务端后,运行客户端程序,系统提示客户在客户端输入上传文件的完整路径。当客户在客户端输入完成后,服务端实现文件上传


43.png

44.png


实现思路:


创建客户端类 FileClient 和服务端类 FileServer

在客户端类中定义uploadFile(Socket socket)方法,用于上传文件,使用BufferedOutputStream包装socket中输入流对象,使用new FileInputStream输入流对象读取本地文件,使用输出流将文件利用socket管道将数据循环发送至服务端

在客户端FileCliet类中,使用new Socket连接本地服务端和端口,调用uploadFile方法实现文件上传

在服务端类FileServer中,定义downFile()方法用于下载文件,该方法中使用BufferedInputStream包装socket中的输入流读取文件内容,并且使用FileOutputStream写到本地

分别运行服务端和客户端程序进行测试


实现代码:


服务端类 FileServer

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class FileServer {
  public ServerSocket server;
  public Socket socket;
  public void downloadFile() {
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    try {
      // 获取Socket管道字节输入流
      InputStream in = socket.getInputStream();
      // 将Socket管道字节输入流,进行缓冲包装提高读取的速度
      bis = new BufferedInputStream(in);
      // 读取客户端发送的文件名
      int length = bis.read();
      byte[] b = new byte[length];
      bis.read(b);
      // 获取需要下载的文件名
      String fileName = this.getFileName(new String(b));
      // 下载的文件对象
      FileOutputStream fos = new FileOutputStream("H://" + this.getFileName(fileName));
      // 对FileOutputStream进行缓冲包装,提高写入的速度
      bos = new BufferedOutputStream(fos);
      // 创建临时变量保存数据
      int data = 0;
      // 写入文件
      while ((data = bis.read()) != -1) {
        bos.write(data);
      }
      System.out.println("客户/" + socket.getInetAddress() + ":上传文件[" + fileName + "]成功");
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        if (bis != null) {
          bis.close();
        }
        if (bos != null) {
          bos.close();
        }
        server.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  // 对文件的全路径进行拆分,返回文件名
  private String getFileName(String fn) {
    String[] files = fn.split("/");
    return files[files.length - 1];
  }
  // 创建服务器
  public void crateServer() {
    try {
      // 创建Socket实例
      server = new ServerSocket(8888);
      // 创建while循环接受多个客户端的连接
      while (true) {
        // 每一个连接的客户端都与服务器维护一条专属的Socket通信管道
        socket = server.accept();
        System.out.println("客户端已经连接");
        downloadFile();
        break;
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  public static void main(String[] args) {
    new FileServer().crateServer();
  }
}


客户端类 FileClient


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class FileClient {
  // 向服务器发送数据
  public void uploadFile(Socket socket) {
    BufferedReader reader = null;
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    try {
      System.out.println("请输入要上传文件的完成路径:");
      // 接收键盘输入
      InputStream in = System.in;
      // 获取Socket管道字节输出流
      OutputStream out = socket.getOutputStream();
      // 使用BufferedReader包装,便于按行读取客户端输入的数据
      reader = new BufferedReader(new InputStreamReader(in));
      // 客户端上传到服务端文件的名字
      String fileName = reader.readLine();
      // 创建字符文件输入流,用于读取上传文件中的数据
      FileInputStream fis = new FileInputStream(fileName);
      // 使用字节输入缓冲提高读取的速度
      bis = new BufferedInputStream(fis);
      // 获取Socket管道输出流,将从文件中的数据写入到管道中
      bos = new BufferedOutputStream(out);
      byte[] nbt = fileName.getBytes();
      // 将文件名字符串转换成字节数组的长度写入到Socket管道中
      bos.write(nbt.length);
      // 将字节数组写入到Socket管道中
      bos.write(nbt);
      // 定义临时变量,将从文件中读取到的数据写入到Socket管道中
      int data = 0;
      // 将文件中的数据写入到Socket管道中
      while ((data = bis.read()) != -1) {
        bos.write(data);
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      // 关闭io流和socket
      try {
        if (reader != null) {
          reader.close();
        }
        if (bis != null) {
          bis.close();
        }
        if (bos != null) {
          bos.close();
        }
        socket.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  public static void main(String[] args) {
    Socket client = null;
    try {
      // 创建客户端套接字对象
      client = new Socket("127.0.0.1", 8888);
      new FileClient().uploadFile(client);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
相关文章
|
1月前
|
运维 监控 JavaScript
JAVA村卫生室、诊所云HIS系统源码 支持医保功能
运维运营分系统 1、系统运维:环境管理、应用管理、菜单管理、接口管理、任务管理、配置管理 2、综合监管:统计监管的医疗机构的综合信息,包括医疗业务量、人员配备量、支付分类占比等。 3、系统运营:机构管理、药品目录管理、用户管理、角色管理、字典管理、模板管理、消息管理、运营配置、售后服务、外部系统。
29 0
|
1月前
|
Java
java程序导出堆文件
java程序导出堆文件
|
1月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
12天前
|
Java Maven
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
33 3
|
4天前
|
Java API Apache
ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)
【4月更文挑战第11天】ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)
23 11
|
26天前
|
Java Spring
上传文件出现 aximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.
上传文件出现 aximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.
10 0
|
27天前
|
Java
elasticsearch使用java程序添加删除修改
elasticsearch使用java程序添加删除修改
9 0
|
1月前
|
Java
java程序
re是java运行时的环境,包含jvm和运行时所需要的类库 jdk是java开的程序包,包含jre和开发人员使用的工具 jvm就是我们常说的java虚拟机,他是整个java实现跨平台的最核心 的部分,所有的java程序会首先被编译为.class的类文件,这种类文 件可以在虚拟机上执行。也就是说class并不直接与机器的操作系统 相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释 给本地系统执行。 只有jvm还不能成class的执行,因为再解释class的时候jvm需要调用 解释所需要的类库lib,而jre包含lib类库。jvm屏蔽了与具体操作系 统平台相关的信息,使得java程
17 0
|
算法 Java Serverless
那些年,我们见过的Java服务端乱象 | 8月6号云栖夜读
今天的首篇文章,讲述了:查尔斯·狄更斯在《双城记》中写道:“这是一个最好的时代,也是一个最坏的时代。”移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动;随着行业竞争加剧,互联网红利逐渐消失,很多创业公司九死一生。
3056 0