原理:文件的复制

客户端读取本地的文件,把文件上传到服务器,服务器把上传的文件保存到服务器的硬盘上

步骤:

1、客户端使用本地的字节输入流,读取要上传的文件

2、客户端使用网路字节输出流,把读取的文件上传到服务器

3、服务器使用网络字节输入流,读取客户端上传的文件

4、服务器使用本地字节输出流,把读取到的文件,保存到服务器的硬盘上面

5、服务器使用网络字节输出流,给客户端会写一个“上传成功”

6、客户端使用网络字节输入流,读取服务器会写的数据

注意:

1、客户端服务器和本地硬盘进行读写,需要使用自己创建的字节流对象(本地流)

2、客户端服务器之间的读写,必须使用Socket中提供的字节流对象(网络流)

客户端:

     FileInputStream fis=new FileInputStream("d:\\a.txt");Socket socket=new Socket("127.0.0.1",8888);OutputStream os=socket.getOutputStream();byte[]bytes=new byte[1024];int len=0;while((len=fis.read(bytes))!=-1){os.write(bytes,0,len);}byte[]bytes1=new byte[1024];InputStream is=socket.getInputStream();while((len=is.read(bytes1))!=-1){System.out.println(new String(bytes1,0,len));}fis.close();socket.close();

服务器端:

    ServerSocket serverSocket=new ServerSocket(8888);Socket socket=serverSocket.accept();InputStream is= socket.getInputStream();byte[]bytes=new byte[1024];int len=0;FileOutputStream fos=new FileOutputStream("d:\\b.txt");while((len=is.read(bytes))!=-1){fos.write(bytes,0,len);}socket.getOutputStream().write("上传完毕".getBytes(StandardCharsets.UTF_8));socket.close();fos.close();

文件上传时阻塞问题:

 解决:上传完文件,给服务器写一个结束标记

void shutdownOutput():禁用此套接字的输出流

对应TCP套接字,任何一起写入的数据都将被发送,并且加上结束标记

socket.shutdownOutput();

优化:

1、自定义文件命名规则

String fileName=System.currentTimeMillis()+new Random().NextInt+".txt";

2、让服务器一直处于监听状态,有一个客户端上传文件,就保存文件

while(true){}

3、启动多线程,上传一次文件,就开启一个线程。

注意:用多线程重写run后不能抛出异常,只能用try--catch

优化后代码:

客户端

     FileInputStream fis=new FileInputStream("d:\\a.txt");Socket socket=new Socket("127.0.0.1",8888);OutputStream os=socket.getOutputStream();byte[]bytes=new byte[1024];int len=0;while((len=fis.read(bytes))!=-1){os.write(bytes,0,len);}socket.shutdownOutput();byte[]bytes1=new byte[1024];InputStream is=socket.getInputStream();while((len=is.read(bytes1))!=-1){System.out.println(new String(bytes1,0,len));}fis.close();socket.close();

服务器:

    ServerSocket serverSocket=new ServerSocket(8888);while(true) {Socket socket = serverSocket.accept();String name = System.currentTimeMillis() + new Random().nextInt(9999) + ".txt";FileOutputStream fos = new FileOutputStream("d:" + "\\" + name);new Thread(()->{try {InputStream is = socket.getInputStream();byte[] bytes = new byte[1024];int len = 0;while ((len = is.read(bytes)) != -1) {fos.write(bytes, 0, len);}socket.getOutputStream().write("上传完毕".getBytes(StandardCharsets.UTF_8));}catch (IOException e){System.out.println(e);}finally {try {socket.close();} catch (IOException e) {e.printStackTrace();}try {fos.close();} catch (IOException e) {e.printStackTrace();}}}).start();}

【java笔记】网络编程:文件上传案例相关推荐

  1. Python攻克之路-网络编程(文件上传实现思路)

    需求:一个server,一个client,实现client把某个文件传到server中某个目录中 分析:实际是实现数据传输,设定一个命令和一个参数(上传的内容),连接后,让用户输入命令和要传送的内容, ...

  2. java利用dropzone多文件上传

    DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库, 它是轻量级的,不依赖任何其他类库(如JQuery)并且高度可定制.文档官网https://www.dropzonejs.com/ ...

  3. 文件上传案例优化(文件命名循环接收多线程提高效率)

    package com.learn.demo03.FileUpload;import java.io.FileInputStream; import java.io.IOException; impo ...

  4. 文件上传案例的服务器端

    package com.learn.demo02.FileUpload;import java.io.File; import java.io.FileOutputStream; import jav ...

  5. 文件上传案例的客户端

    package com.learn.demo02.FileUpload;import java.io.FileInputStream; import java.io.IOException; impo ...

  6. Servlet笔记十(文件上传和下载)

    本栏博客目录 Serlvet笔记一(Servlet基础) Servlet笔记二(请求和响应) Servlet笔记三(会话及其会话技术) Servlet笔记四(JSP技术) Servlet笔记五(EL表 ...

  7. 【信安学习笔记三】文件上传

    个人学习参考用笔记 目录 前言 一.文件上传 **定义** **危害** **查找及判断** **分类** 二.验证与绕过 前端防护 后端防护 (一)黑名单 (二)白名单 (三)内容及其他 三.漏洞 ...

  8. Web网络攻防文件上传。.

    Web网络攻防文件上传 上传漏洞靶场upload-labs安装 upload-labs 是由php 语言靶场,因此需要在PhpStudy下进行使用. 靶场文件下载:https://github.com ...

  9. java前后台开发之文件上传

    入职java已经快2个月了.做了一个多月的改bug,6天的开发,刚做完一个文件上传,得好好整理下. 文件上传的大体思路其实是一样的,前端通过表单的方式上传,后端解析这个表单请求中的内容,得到文件部分的 ...

最新文章

  1. String字符串编码解码格式
  2. 我的世界之史蒂夫生存记
  3. 017_SpringBoot异常处理方式-自定义错误页面
  4. C#实现实体类和XML相互转换
  5. java中自定义表单和流程_让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑....
  6. DOM 事件深入浅出(一)
  7. php中ini_get,关于ini_get php手册的例子?
  8. git 查看修改明细_git查看某个文件的修改历史
  9. SharePoint 2010 获取列表全部定义方法
  10. Serializable作用
  11. jq和js的关系_jquery与js的区别是什么?js与jquery的用法区别介绍
  12. 修改保存hosts文件
  13. 设计模式(2)-抽象工厂模式(Abstract Factory)与生成器模式(Builder)模式
  14. Laya的位图字体bitmapFont字体用法
  15. C#:实现离散型马尔可夫链模型算法(附完整源码)
  16. C64x EDMA Architecture
  17. 小白linux学习[1]__虚拟机NAT方式共享电信拨号上网
  18. saltstackmysql return报错
  19. 头歌实践教学平台——python程序设计——元组的使用
  20. 【电磁场】矢量分析基础

热门文章

  1. cacti安装后修改说明
  2. Bailian2936 试剂配制【标记+逻辑】
  3. Bailian2926 算术运算【水题】
  4. UVA11309 Counting Chaos【Ad Hoc】
  5. HYSBZ2761 不重复数字【序列处理】(BZOJ2761)
  6. 诗词文中的地名(名人生卒地、生卒年、名人籍贯)
  7. Java 并发 —— Thread、Executor、线程池
  8. Python 标准库 —— glob
  9. Python 标准库 —— xml
  10. 机器学习基础(二十九)—— 径向基核函数(RBF)