文档章节

文件秒传

凯哥学堂
 凯哥学堂
发布于 2017/07/26 12:16
字数 594
阅读 3
收藏 1

image

ClientFiles.java

/**
 * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com
 * @author 小沫
 */
package com.files.mc;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientFiles extends Thread {

	public void run() {

		try {
			Socket socket = new Socket("127.0.0.1", 8080);
			InputStream fin = socket.getInputStream();
			OutputStream fout = socket.getOutputStream();

			File file = new File("E:/迅雷下载/170322-04.mp4");
			long times = System.currentTimeMillis();
			System.out.println("\t正在校验 " + file.getName() + "文件MD5请稍后...\n");
			String md5 = MD5FileUtil.getFileMD5String(file);// 把此文件数据进行MD5加密
			System.out.println("[MD5验证完毕  耗时: " + 
			(System.currentTimeMillis() - times) / 1000 + " 秒  正在执行数据传输]\n");
			fout.write(md5.getBytes());// 把加密出来的MD5发送到服务端
			fout.flush();

			if (fin.read() == 0) {// 服务端传过来的是0 说明服务端上有相同数据
				// 打印秒传了
				System.out.println("数据传输完毕!大小: " + file.length() + " 字节  耗时: 0秒 ! 秒传机制");
			} else {
				// 打印的不是0,那么开始把数据传输给服务端
				long time = System.currentTimeMillis();
				System.out.println("\t\t数据传输中...\n");
				FileInputStream filein = new FileInputStream(file);
				byte[] b = new byte[1024 * 1024 * 2];
				while (filein.available() != 0) {
					int len = filein.read(b);
					fout.write(b, 0, len);
					fout.flush();
				}
				System.out.println(
						"文件传输完毕!大小: " + file.length() + " 字节  耗时: " + (System.currentTimeMillis() - time) / 1000 + "秒");
				filein.close();
			}
			fout.close();
			fin.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new ClientFiles().start();// 启动客户端线程
	}
}

ServerFiles.java

/**
 * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com
 * @author 小沫
 */
package com.files.mc;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.zip.InflaterOutputStream;

public class ServerFiles implements Runnable {

	private Socket socket;
	public ServerFiles(Socket socket) {
		this.socket = socket;
	}
	public void run() {
		try {
			InputStream fin = socket.getInputStream();
			OutputStream fout = socket.getOutputStream();

			byte[] b = new byte[1024];
			int len = 0;
			len = fin.read(b);
			String md5 = new String(b, 0, len);//接收客户端传的MD5
			System.out.println(md5);
			File file = new File("filess");
			File[] files = file.listFiles();
			boolean state = false;//状态默认为false 用来判断MD5是否存在
			for (File file2 : files) {
				//如果找到了相同的MD5
				if (file2.getName().equalsIgnoreCase(md5)) {
					state = true;//状态就改为true 表示有相同的MD5
					break;
				}
			}
			if (state == false) {
				//没有找到相同的MD5 就给客户端发送1过去 让客户端开始把数据发过来
				fout.write(1);
				fout.flush();
				
				FileOutputStream fileout = new FileOutputStream(new File("filess", md5));
				byte[] b1 = new byte[1024 * 1024 * 2];
				
				//把客户端发来的数据存储到文件中
				while ((len = fin.read(b)) != -1) {
					fileout.write(b1, 0, len);
				}
				 fileout.close();
			} else {
				//如果找到了相同的MD5那么发送0给客户端 
				fout.write(0);
				fout.flush();
			}
			fout.close();
			fin.close();
			socket.close();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void openServer() throws Exception {
		ServerSocket server = new ServerSocket(8080);
		ExecutorService executor = Executors.newFixedThreadPool(10);//线程池
		while (true) {
			ServerFiles socket = new ServerFiles(server.accept());
			executor.execute(socket);
		}
	}

	public static void main(String[] args) {
		try {
			openServer();//启动服务端
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

© 著作权归作者所有

凯哥学堂
粉丝 18
博文 316
码字总数 284948
作品 0
东城
程序员
私信 提问
Payne/aetherupload-laravel

AetherUpload-Laravel 提供超大文件上传的Laravel扩展包,支持分组配置、断线续传、秒传等功能,简单易用,满足多数人的主流需求,无需编写适配代码,几乎开箱即用。基于Laravel 5开发,目前...

Payne
2017/07/19
0
0
基于Laravel 5 超大文件上传工具--AetherUpload-Laravel

AetherUpload-Laravel 提供超大文件上传的Laravel扩展包,支持分组配置、断线续传、秒传等功能,简单易用,满足多数人的主流需求,无需添加额外代码,几乎开箱即用。基于Laravel 5开发,目前...

pein_hu
2016/06/30
2.1K
0
网盘--iBarn

iBarn是一个先进的网盘系统,提供文件的网络备份,同步和分享服务。支持断点续传,秒传等功能。 可选择文件下载到本地或者在线收藏;回收站功能防止用户误删数据。云存储的不二之选 功能列表...

飘渺孤鸿影love
2015/09/10
9.1K
2
30分钟玩转Net MVC 基于WebUploader的大文件分片上传、断网续传、秒传(文末附带demo下载)

现在的项目开发基本上都用到了上传文件功能,或图片,或文档,或视频。我们常用的常规上传已经能够满足当前要求了, 然而有时会出现如下问题: 文件过大(比如1G以上),超出服务端的请求大小...

学习中的苦与乐
02/21
0
0
令狐大侠/大文件上传断点续传fastdfs

大文件上传,断点续传,秒传,fastdfs 项目介绍 实现h5与fastdfs之间的断点续传,大文件上传,秒传 软件架构 软件架构说明 webuploader+springboot+redis+fastdfs(服务端)+FastDFS_Client(非官网,...

令狐大侠
2018/06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
今天
3
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
今天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
今天
19
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
9
0
太全了|万字详解Docker架构原理、功能及使用

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpa...

Java技术剑
今天
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部