Java利用Socket和IO流实现文件的上传与下载

 更新时间:2022年04月12日 15:51:59   作者:谷哥的小弟  
本文主要介绍了Java利用Socket和IO流实现文件的上传与下载,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

背景概述

本文利用Socket编程和IO流技术实现文件的上传与下载。

核心技术

  • 1、TCP
  • 2、Socket
  • 3、FileInputStream与FileOutputStream
  • 4、DataInputStream与DataOutputStream
  • 5、多线程

Config

package com.io14;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class Config {
	public static final String ip = "localhost";
	public static final int port = 10088;
}

在这里插入图片描述

Client

package com.io14;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class Client {

	public static void main(String arg[]) {
		testDownload();
	}

	public static void testUpload() {
		String filePath = "D:" + File.separator + "beauty.jpg";
		Client client = new Client();
		client.uploadFile(filePath);
	}

	public static void testDownload() {
		Client client = new Client();
		client.downloadFile();
	}

	public void uploadFile(String filePath) {
		try {
			// 创建待上传文件对象
			File file = new File(filePath);
			String fileName = file.getName();
			long fileLength = file.length();
			System.out.println("客户端待上传文件:" + fileName + ",其大小为:" + fileLength);

			// 创建FileInputStream
			FileInputStream fileInputStream = new FileInputStream(filePath);

			// 创建Socket对象
			Socket socket = new Socket(Config.ip, Config.port);
			// 从Socket获取OutputStream
			OutputStream outputStream = socket.getOutputStream();
			// 创建DataOutputStream
			DataOutputStream dataOutputStream = new DataOutputStream(outputStream);

			// 利用DataOutputStream写出文件名和文件大小
			dataOutputStream.writeUTF(fileName);
			dataOutputStream.writeLong(fileLength);
			dataOutputStream.flush();

			// IO流读写操作
			byte[] buf = new byte[1024 * 1];
			int len = 0;
			while ((len = fileInputStream.read(buf)) != -1) {
				dataOutputStream.write(buf, 0, len);
			}

			// 释放资源
			dataOutputStream.flush();
			fileInputStream.close();
			socket.close();
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}

	public void downloadFile() {
		try {
			// 创建Socket对象
			Socket socket = new Socket(Config.ip, Config.port);
			// 从Socket获取InputStream
			InputStream inputStream = socket.getInputStream();
			// 创建DataInputStream对象
			DataInputStream dataInputStream = new DataInputStream(inputStream);

			// 获取下载文件的文件名和文件大小
			String fileName = dataInputStream.readUTF();
			long fileLength = dataInputStream.readLong();
			System.out.println("客户端下载文件:" + fileName + ",其大小为:" + fileLength);

			// 组拼文件保存路径
			String fileDir = "D:";
			String filePath = fileDir + File.separator + fileName;

			// 创建FileOutputStream对象
			FileOutputStream fileOutputStream = new FileOutputStream(filePath);

			// IO流读写操作
			byte[] buf = new byte[1024 * 1];
			int len = 0;
			while ((len = dataInputStream.read(buf)) != -1) {
				fileOutputStream.write(buf, 0, len);
			}

			// 释放资源
			fileOutputStream.flush();
			fileOutputStream.close();
			dataInputStream.close();
			socket.close();
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}

}

在这里插入图片描述

Server

package com.io14;

import java.net.ServerSocket;
import java.net.Socket;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class Server {
	public static void main(String arg[]) {
		testDownload();
	}
	
	public static void testUpload() {
		Server server = new Server();
		server.handleUploadFile();
	}
	
	public static void testDownload() {
		Server server = new Server();
		server.handleDownloadFile();
	}

	public void handleUploadFile() {
		try {
			// 创建ServerSocket对象
			ServerSocket serverSocket = new ServerSocket(Config.port);
			while (true) {
				// 接收客户端连接请求
				Socket socket = serverSocket.accept();
				// 开启子线程处理文件上传
				UploadRunnableImpl uploadRunnableImpl = new UploadRunnableImpl(socket);
				Thread thread = new Thread(uploadRunnableImpl);
				thread.start();
			}
		} catch (Exception e) {
			System.out.println(e.toString());
		}

	}

	public void handleDownloadFile() {
		try {
			// 创建ServerSocket对象
			ServerSocket serverSocket = new ServerSocket(Config.port);
			while (true) {
				// 接收客户端连接请求
				Socket socket = serverSocket.accept();
				// 开启子线程处理文件下载
				DownloadRunnableImpl downloadRunnableImpl = new DownloadRunnableImpl(socket);
				Thread thread = new Thread(downloadRunnableImpl);
				thread.start();
			}
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}

}

在这里插入图片描述

UploadRunnableImpl

package com.io14;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class UploadRunnableImpl implements Runnable {
	private Socket socket;
	
	public UploadRunnableImpl(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		try {
			// 从Socket获取InputStream
			InputStream inputStream = socket.getInputStream();
			// 创建DataInputStream对象
			DataInputStream dataInputStream = new DataInputStream(inputStream);
			
			// 获取上传文件的文件名和文件大小
			String fileName = dataInputStream.readUTF();
			long fileLength = dataInputStream.readLong();
			System.out.println("服务端接收上传文件:"+fileName+",其大小为:"+fileLength);
			
			// 组拼文件保存路径
			String fileDir = "E:";
			String filePath= fileDir + File.separator+fileName;
			
			// 创建FileOutputStream对象
			FileOutputStream fileOutputStream = new FileOutputStream(filePath);
			
			// IO流读写操作
			byte[] buf = new byte[1024*1];
			int len = 0;
			while ((len = dataInputStream.read(buf)) != -1) {
				fileOutputStream.write(buf, 0, len);
			}
			
			// 释放资源
			fileOutputStream.flush();
			fileOutputStream.close();
			dataInputStream.close();
			socket.close();
		} catch (Exception e) {
			System.out.println(e.toString());
		}

	}

}

在这里插入图片描述

DownloadRunnableImpl

package com.io14;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class DownloadRunnableImpl implements Runnable{
	private Socket socket;
	
	public DownloadRunnableImpl(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		try {
			// 创建待下载文件对象
			String filePath = "E:"+File.separator+"beauty.jpg";
			File file = new File(filePath);
			String fileName = file.getName();
			long fileLength = file.length();
			System.out.println("服务端待下载文件:" + fileName + ",其大小为:" + fileLength);

			// 创建FileInputStream
			FileInputStream fileInputStream = new FileInputStream(filePath);

			// 从Socket获取OutputStream
			OutputStream outputStream = socket.getOutputStream();
			// 创建DataOutputStream
			DataOutputStream dataOutputStream = new DataOutputStream(outputStream);

			// 利用DataOutputStream写出文件名和文件大小
			dataOutputStream.writeUTF(fileName);
			dataOutputStream.writeLong(fileLength);
			dataOutputStream.flush();

			// IO流读写操作
			byte[] buf = new byte[1024 * 1];
			int len = 0;
			while ((len = fileInputStream.read(buf)) != -1) {
				dataOutputStream.write(buf, 0, len);
			}

			// 释放资源
			dataOutputStream.flush();
			fileInputStream.close();
			socket.close();
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}

}

在这里插入图片描述

到此这篇关于Java利用Socket和IO流实现文件的上传与下载的文章就介绍到这了,更多相关Java 文件上传与下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot自动装配之注入DispatcherServlet的实现方法

    Springboot自动装配之注入DispatcherServlet的实现方法

    这篇文章主要介绍了Springboot自动装配之注入DispatcherServlet,Springboot向外界提供web服务,底层依赖了springframework中的web模块来实现,那么springboot在什么时机向容器注入DispatcherServlet这个核心类的呢?带着这个问题一起通过本文学习吧
    2022-05-05
  • java实现轻量型http代理服务器示例

    java实现轻量型http代理服务器示例

    这篇文章主要介绍了java实现轻量型http代理服务器示例,需要的朋友可以参考下
    2014-04-04
  • SpringBoot为啥不用配置启动类的实现

    SpringBoot为啥不用配置启动类的实现

    这篇文章主要介绍了SpringBoot为啥不用配置启动类的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java实现带头结点的单链表

    Java实现带头结点的单链表

    这篇文章主要为大家详细介绍了Java实现带头结点的单链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • Java编程实现轨迹压缩算法开放窗口实例代码

    Java编程实现轨迹压缩算法开放窗口实例代码

    这篇文章主要介绍了Java编程实现轨迹压缩算法开放窗口实例代码,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • java中Filter过滤器处理中文乱码的方法

    java中Filter过滤器处理中文乱码的方法

    java中Filter过滤器处理中文乱码的方法,需要的朋友可以参考一下
    2013-05-05
  • SpringBoot+MinIO实现文件切片极速详解

    SpringBoot+MinIO实现文件切片极速详解

    在现代Web应用中,文件上传是一个常见的需求,尤其是对于大文件的上传,如视频、音频或大型文档,所以本文就来为大家介绍一下如何使用Spring Boot和MinIO实现文件切片极速上传技术吧
    2023-12-12
  • idea导入springboot项目没有maven的解决

    idea导入springboot项目没有maven的解决

    这篇文章主要介绍了idea导入springboot项目没有maven的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Spring Boot利用@Async异步调用:使用Future及定义超时详解

    Spring Boot利用@Async异步调用:使用Future及定义超时详解

    这篇文章主要给大家介绍了关于Spring Boot利用@Async异步调用:使用Future及定义超时的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友可以参考下
    2018-05-05
  • Java支持方法重载的原因

    Java支持方法重载的原因

    今天给大家带来的是关于Java的相关知识,文章围绕着Java方法重载展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06

最新评论