文件秒传
2019獨角獸企業重金招聘Python工程師標準>>>
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);//接收客戶端傳的MD5System.out.println(md5);File file = new File("filess");File[] files = file.listFiles();boolean state = false;//狀態默認為false 用來判斷MD5是否存在for (File file2 : files) {//如果找到了相同的MD5if (file2.getName().equalsIgnoreCase(md5)) {state = true;//狀態就改為true 表示有相同的MD5break;}}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();}} }轉載于:https://my.oschina.net/kaige123/blog/1488864
總結
- 上一篇: 【.net 深呼吸】在运行阶段修改应用配
- 下一篇: 2017年英特尔在其数据中心业务和AI方