文章目录

  • 整个功能的实现步骤
  • 客户端的实现步骤
  • 服务端的实现步骤
  • 示例代码

整个功能的实现步骤

1.客户端使用本地的字节输入流读取被上传的文件数据
2.客户端使用网络字节输出流,将读取到的文件数据发送给服务端
3.服务端使用网络字节输入流读取客户端发送过来的文件数据
4.服务端使用本地字节输出流将读取到的文件数据写入到指定的服务器本地文件中(例如,保存到目录 upload 下面)
5.服务端使用网络字节输出流,给客户端回写一段文字:“上传成功”
6.客户端使用网络字节输入流,读取服务端返回的数据
7.释放资源

注意:
1.客户端和服务端对本地硬盘进行读写,需要使用自己创建的 IO 流,称为本地流
2.客户端和服务端之间进行数据读写,必须使用 Socket 中提供的 IO 流,称为网络流

客户端的实现步骤

1.创建一个本地字节输入流对象(即 FileInputStream),构造方法中绑定要读取的数据源
2.创建一个客户端对象(即 Socket 对象),构造方法中绑定 IP 和端口号
3.使用 Socket 对象的方法 getOutputStream,获取网络字节输出流对象
4.使用 FileInputStream 对象的方法 read 读取要上传的文件数据
5.使用网络字节输出流对象的方法 write,将读取到的文件数据发送到服务端
6.使用 Socket 对象的方法 getInputStream 获取网络字节输入流对象
7.使用网络字节输入流对象的方法 read 读取服务端回写的数据
8.释放资源(FileInputStream、Socket)

服务端的实现步骤

1.创建一个服务端对象(即 ServerSocket),并且向系统要指定的端口号
2.使用服务端对象的方法 accept 获取请求的客户端对象(即请求连接的 Socket 对象)
3.使用 Socket 对象的方法 getInputStream 获取网络字节输入流
4.判断服务端的目标目录路径是否存在,若不存在要创建此目录
5.创建一个本地字节输出流对象(即 FileOutputStream),构造方法中要绑定写入数据的目标文件路径
6.使用网络字节输入流的方法 read 读取客户端发送过来的文件数据
7.使用 FileOutputStream 对象的方法 write 将读取到文件数据写入到服务器本地文件中
8.使用 Socket 对象的方法 getOutputStream 获取网络字节输出流对象
9.使用网络字节输出流对象的方法 write 给客户端发送一段文字:文件上传成功!
10.释放资源(FileOutputStream、Socket、ServerSocket)

示例代码

客户端代码:

package priv.lwx.javaex.fileupload;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;/*** @ClassName TCPClient* @Description 客户端读取本地的文件数据,发送给服务端* @Author liaowenxiong* @Version 1.0* @date 2021/9/5 下午4:50*/
public class TCPClient {public static void main(String[] args) throws IOException {// 1.创建一个本地字节输入流对象(即 `FileInputStream`),构造方法中绑定要读取的数据源FileInputStream fis = new FileInputStream("/Users/liaowenxiong/desktop/test/1.jpeg");// 2.创建一个客户端对象(即 Socket 对象),构造方法中绑定 IP 和端口号Socket socket = new Socket("127.0.0.1", 8888);// 3.使用 Socket 对象的方法 getOutputStream,获取网络字节输出流对象OutputStream os = socket.getOutputStream();// 4.使用 FileInputStream 对象的方法 read 读取要上传的文件数据byte[] bytes = new byte[1024];int i = 0;while ((i = fis.read(bytes)) != -1) {// 5.使用网络字节输出流对象的方法 write,将读取到的文件数据发送到服务端os.write(bytes, 0, i); // i表示获取数组元素的个数}// 禁用此套接字的输出流,此时会写入一个终止标记,这样服务端就可以读取到此标记,就不会出现阻塞的问题了// 终止标记表示输出流写出的数据已经没有了,服务端解析到这个标记后就,有关的线程就不会一直处于等待接收// 数据的状态socket.shutdownOutput();// 6.使用 Socket 对象的方法 getInputStream 获取网络字节输入流对象InputStream is = socket.getInputStream();// 7.使用网络字节输入流对象的方法 read 读取服务端回写的数据到指定的字节数组中i = is.read(bytes);// 读取几个字节,就返回几// 将字节数组中的数据转换成字符串,并打印到控制台System.out.println(new String(bytes, 0, i));// 8.释放资源(FileInputStream、Socket)fis.close();socket.close();}
}

服务端代码:

package priv.lwx.javaex.fileupload;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** @ClassName TCPServer* @Description 服务端读取客户端发送过来的文件数据,并写入到指定的服务器本地的文件中* @Author liaowenxiong* @Version 1.0* @date 2021/9/5 下午7:38*/
public class TCPServer {public static void main(String[] args) throws IOException {// 1.创建一个服务端对象(即 ServerSocket),并且向系统要指定的端口号ServerSocket server = new ServerSocket(8888);// 2.使用服务端对象的方法 accept 获取请求的客户端对象(即请求连接的 Socket 对象)Socket socket = server.accept();// 3.使用 Socket 对象的方法 getInputStream 获取网络字节输入流InputStream is = socket.getInputStream();// 4.判断服务端的目标目录路径是否存在,若不存在要创建此目录File file = new File("/Users/liaowenxiong/desktop/test/upload");if (!file.exists()) {file.mkdirs();}// 5.创建一个本地字节输出流对象(即 FileOutputStream),构造方法中要绑定写入数据的目标文件路径FileOutputStream fos = new FileOutputStream(file + File.separator + "1.jpeg");// 6.使用网络字节输入流的方法 read 读取客户端发送过来的文件数据byte[] bytes = new byte[1024];int i = 0;while ((i = is.read(bytes)) != -1) {// 7.使用 FileOutputStream 对象的方法 write 将读取到文件数据写入到服务器本地文件中fos.write(bytes, 0, i);}// 8.使用 Socket 对象的方法 getOutputStream 获取网络字节输出流对象OutputStream ops = socket.getOutputStream();// 9.使用网络字节输出流对象的方法 write 给客户端发送一段文字:文件上传成功!ops.write("文件上传成功!".getBytes());// 10.释放资源(FileOutputStream、Socket、ServerSocket)fos.close();socket.close();server.close();}}

服务端的升级版本一:

package priv.lwx.javaex.fileupload;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;/*** @ClassName TCPServer* @Description 服务端读取客户端发送过来的文件数据,并写入到指定的服务器本地的文件中*              在 TCPServer 的基础上优化两个地方*              1.自定义文件名,每次上传文件的文件名都不同*              2.让服务端一直处于监听状态,这样就可以一直上传图片** @Author liaowenxiong* @Version 1.0* @date 2021/9/5 下午7:38*/
public class TCPServer02 {public static void main(String[] args) throws IOException {// 1.创建一个服务端对象(即 ServerSocket),并且向系统要指定的端口号ServerSocket server = new ServerSocket(8888);// 2.使用服务端对象的方法 accept 获取请求的客户端对象(即请求连接的 Socket 对象)// 通过死循环,可以让服务端一直处于监听状态,只要有客户端请求连接,服务端就可以响应连接请求while (true) {Socket socket = server.accept();// 3.使用 Socket 对象的方法 getInputStream 获取网络字节输入流InputStream is = socket.getInputStream();// 4.判断服务端的目标目录路径是否存在,若不存在要创建此目录File file = new File("/Users/liaowenxiong/desktop/test/upload");if (!file.exists()) {file.mkdirs();}// 自定义文件名的规则String fileName = System.currentTimeMillis() + (new Random().nextInt(9) + 1) + ".jpeg";// 5.创建一个本地字节输出流对象(即 FileOutputStream),构造方法中要绑定写入数据的目标文件路径FileOutputStream fos = new FileOutputStream(file + File.separator + fileName);// 6.使用网络字节输入流的方法 read 读取客户端发送过来的文件数据byte[] bytes = new byte[1024];int i = 0;while ((i = is.read(bytes)) != -1) {// 7.使用 FileOutputStream 对象的方法 write 将读取到文件数据写入到服务器本地文件中fos.write(bytes, 0, i);}// 8.使用 Socket 对象的方法 getOutputStream 获取网络字节输出流对象OutputStream ops = socket.getOutputStream();// 9.使用网络字节输出流对象的方法 write 给客户端发送一段文字:文件上传成功!ops.write("文件上传成功!".getBytes());// 10.释放资源(FileOutputStream、Socket、ServerSocket)fos.close();socket.close();// 服务端不停止,服务端资源不要释放// server.close();}}}

服务端的升级版本二:

package priv.lwx.javaex.fileupload;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;/*** @ClassName TCPServer* @Description 服务端读取客户端发送过来的文件数据,并写入到指定的服务器本地的文件中*              在 TCPServer02 基础上优化*              使用多线程技术,提高程序的效率,有一个客户端上传文件,就开启一个线程完成文件的上传* @Author liaowenxiong* @Version 1.0* @date 2021/9/5 下午7:38*/
public class TCPServer03 {public static void main(String[] args) throws IOException {// 1.创建一个服务端对象(即 ServerSocket),并且向系统要指定的端口号ServerSocket server = new ServerSocket(8888);// 2.使用服务端对象的方法 accept 获取请求的客户端对象(即请求连接的 Socket 对象)// 通过死循环,可以让服务端一直处于监听状态,只要有客户端请求连接,服务端就可以响应连接请求while (true) {Socket socket = server.accept();// 使用多线程技术,提高文件上传的效率,有一个客户端上传文件,就开启一个线程完成文件的上传new Thread(new Runnable() {// run 方法里面完成文件数据的读取和写入@Overridepublic void run() {FileOutputStream fos = null;try {// 3.使用 Socket 对象的方法 getInputStream 获取网络字节输入流InputStream is = socket.getInputStream();// 4.判断服务端的目标目录路径是否存在,若不存在要创建此目录File file = new File("/Users/liaowenxiong/desktop/test/upload");if (!file.exists()) {file.mkdirs();}// 自定义文件名的规则String fileName = System.currentTimeMillis() + (new Random().nextInt(9) + 1) + ".jpeg";// 5.创建一个本地字节输出流对象(即 FileOutputStream),构造方法中要绑定写入数据的目标文件路径fos = new FileOutputStream(file + File.separator + fileName);// 6.使用网络字节输入流的方法 read 读取客户端发送过来的文件数据byte[] bytes = new byte[1024];int i = 0;while ((i = is.read(bytes)) != -1) {// 7.使用 FileOutputStream 对象的方法 write 将读取到文件数据写入到服务器本地文件中fos.write(bytes, 0, i);}// 8.使用 Socket 对象的方法 getOutputStream 获取网络字节输出流对象OutputStream ops = socket.getOutputStream();// 9.使用网络字节输出流对象的方法 write 给客户端发送一段文字:文件上传成功!ops.write("文件上传成功!".getBytes());// 10.释放资源(FileOutputStream、Socket、ServerSocket)} catch (IOException e) {// System.out.println(e);e.printStackTrace();} finally {try {fos.close();socket.close();// 服务端不停止,服务端资源不要释放// server.close();} catch (IOException e) {e.printStackTrace();}}}}).start();}}}

通过Socket实现文件上传/上传文件相关推荐

  1. Java网络编程入门,包含网络相关概念、InetAddress类、套接字Socket、网络上传和下载文件等

    Java学习-11-韩顺平老师 Java-网络编程入门 目录: 01-网络相关概念 02-InetAddress类 03-套接字Socket 04-网络上传和下载文件 05-UDP网络编程 网络编程相 ...

  2. java实现ftp连接、登陆、上传、下载、删除文件、获取目录、文件列表

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java实现ftp连接.登陆.上传.下载.删除文件.获取目录.文件列表等操作. 本地调试,首先需要在本机上开启ftp服务和ftp站点. 测试代码 ...

  3. Confluence wiki上传文件时报“不能上传文件至Confluence中,服务器可能已失效”

    Confluence wiki 上传文件时报"不能上传文件至Confluence中,服务器可能已失效"的解决方法. 一. 后台管理修改配置 首先用管理员登陆Confluence后台 ...

  4. 企业微信上传临时素材文件

    1.控制层 /*** 上传临时素材*/@ResponseBody@PostMapping("/uploadResource")public BaseResponse uploadR ...

  5. python 通过ftp自动 上传指定excel文件

    #!/usr/bin/python # -*- coding: UTF-8 -*- from ftplib import FTP import sys import time import socke ...

  6. Java Client/Server 上传文件到服务器与保存文件到本地

    新年第一章,祝大家新年快乐. ----------------------------------------------------------------------- 这个是我们的Java期末考 ...

  7. java spring js文件_005-html+js+spring multipart文件上传

    一.概述 需求:通过html+js+java上传最大500M的文件,需要做MD5 消息摘要以及SHA256签名,文件上传至云存储 1.1.理解http协议 https://www.cnblogs.co ...

  8. linux环境下,模拟百度网盘上传、下载文件

    目录 1.题目 2.运行截图 3.总体设计 4.详细设计 5.源码 5.1服务端 5.2客户端 1.题目 1)模仿百度网盘实现一个文件上传.下载.浏览的终端网盘; 2)能够实现文件和目录的存储; 3) ...

  9. html web上传文件原理,Web上传文件的原理及实现

    本文为原创,如需转载,请注明作者和出处,谢谢! 现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的Commons FileUpload.还有Struts1.x和Stru ...

  10. Python监控目录文件夹,并使用SFTP上传目录及文件到linux服务器

    Python 扫描监控本地文件夹并进行超大文件上传 方案1:WebUploader大文件分块多线程并发上传 方案2:watchdog目录文件夹监控,paramiko STFP上传服务器 方案3:优化2 ...

最新文章

  1. MATLAB 不能用了,哪些替代品可以继续搞科研?
  2. access两字段同时升序排序_7 天时间,我整理并实现了这 9 种常见的排序算法
  3. python怎么学最快-浅谈:从为什么学习python到如何学好python
  4. python主要用于什么-python主要用于哪些方向
  5. JS点击显示隐藏内容
  6. tensorflow使用tf.placeholder会报错
  7. 关于Keil 的快速注释功能,并为其添加快捷键
  8. boost::signals2模块实现为类定义预析构函数的最小示例的测试程序
  9. 杭电oj java printf_杭电oj1042题大数,java,百思不得其解为何WA,求指教
  10. unittest-常见问题解决方案记录
  11. 大数据之HBase教程
  12. virtualbox 安装kali linux虚拟机,kali Linux安装virtualbox虚拟机之爬坑经历
  13. 一个人要干成事,需要搞清楚自己的三个“半径”
  14. 5.2 tensorflow2实现多元线性回归、完成广告投放销售额预测——python实战
  15. 判断IE版本的HTML语句详解,如:!--[if IE 9] 仅IE9可识别 ![endif]--
  16. kali linux权限维持,msfconsole权限维持
  17. GM620光猫telnet获取pppoe密码
  18. 使用好压(HaoZip)软件打包EverEdit制作安装程序
  19. php遵义旅游管理系统的设计与实现毕业设计源码091801
  20. 手机恢复出厂设置难防泄密:微信聊天记录可恢复

热门文章

  1. selenium自动化测试_使用Selenium自动化测试处理多个浏览器选项卡
  2. spring 安全编码_Spring安全性和密码编码
  3. drill apache_Apache Drill 1.4性能增强的简要概述
  4. camel 使用_使用Camel从WildFly 8向WebLogic 12发送JMS消息
  5. osgi:install_OSGi服务测试助手:ServiceRegistrationRule
  6. JDBC –模拟序列
  7. 内存映射文件 写入 卡住_在Java中使用内存映射文件时检测(写入)失败
  8. aop 代码_项目学生:使用AOP简化代码
  9. 带有ActiveMQ和Maven的JMS Sender应用程序
  10. 在Java 7或更早版本中使用Java 8 Lambda表达式