【java笔记】网络编程:文件上传案例
原理:文件的复制
客户端读取本地的文件,把文件上传到服务器,服务器把上传的文件保存到服务器的硬盘上
步骤:
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笔记】网络编程:文件上传案例相关推荐
- Python攻克之路-网络编程(文件上传实现思路)
需求:一个server,一个client,实现client把某个文件传到server中某个目录中 分析:实际是实现数据传输,设定一个命令和一个参数(上传的内容),连接后,让用户输入命令和要传送的内容, ...
- java利用dropzone多文件上传
DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库, 它是轻量级的,不依赖任何其他类库(如JQuery)并且高度可定制.文档官网https://www.dropzonejs.com/ ...
- 文件上传案例优化(文件命名循环接收多线程提高效率)
package com.learn.demo03.FileUpload;import java.io.FileInputStream; import java.io.IOException; impo ...
- 文件上传案例的服务器端
package com.learn.demo02.FileUpload;import java.io.File; import java.io.FileOutputStream; import jav ...
- 文件上传案例的客户端
package com.learn.demo02.FileUpload;import java.io.FileInputStream; import java.io.IOException; impo ...
- Servlet笔记十(文件上传和下载)
本栏博客目录 Serlvet笔记一(Servlet基础) Servlet笔记二(请求和响应) Servlet笔记三(会话及其会话技术) Servlet笔记四(JSP技术) Servlet笔记五(EL表 ...
- 【信安学习笔记三】文件上传
个人学习参考用笔记 目录 前言 一.文件上传 **定义** **危害** **查找及判断** **分类** 二.验证与绕过 前端防护 后端防护 (一)黑名单 (二)白名单 (三)内容及其他 三.漏洞 ...
- Web网络攻防文件上传。.
Web网络攻防文件上传 上传漏洞靶场upload-labs安装 upload-labs 是由php 语言靶场,因此需要在PhpStudy下进行使用. 靶场文件下载:https://github.com ...
- java前后台开发之文件上传
入职java已经快2个月了.做了一个多月的改bug,6天的开发,刚做完一个文件上传,得好好整理下. 文件上传的大体思路其实是一样的,前端通过表单的方式上传,后端解析这个表单请求中的内容,得到文件部分的 ...
最新文章
- String字符串编码解码格式
- 我的世界之史蒂夫生存记
- 017_SpringBoot异常处理方式-自定义错误页面
- C#实现实体类和XML相互转换
- java中自定义表单和流程_让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑....
- DOM 事件深入浅出(一)
- php中ini_get,关于ini_get php手册的例子?
- git 查看修改明细_git查看某个文件的修改历史
- SharePoint 2010 获取列表全部定义方法
- Serializable作用
- jq和js的关系_jquery与js的区别是什么?js与jquery的用法区别介绍
- 修改保存hosts文件
- 设计模式(2)-抽象工厂模式(Abstract Factory)与生成器模式(Builder)模式
- Laya的位图字体bitmapFont字体用法
- C#:实现离散型马尔可夫链模型算法(附完整源码)
- C64x EDMA Architecture
- 小白linux学习[1]__虚拟机NAT方式共享电信拨号上网
- saltstackmysql return报错
- 头歌实践教学平台——python程序设计——元组的使用
- 【电磁场】矢量分析基础