日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 文件传输 (TCP、UDP)

發布時間:2023/12/14 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 文件传输 (TCP、UDP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  TCP:面向連接、傳輸可靠(保證數據正確性,保證數據順序)、用于傳輸大量數據(流模式)、速度慢,建立連接需要開銷較多(時間,系統資源)。

  UDP:面向非連接、傳輸不可靠、用于傳輸少量數據(數據包模式)、速度快

TCP

(客戶端)

package TCP;import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.util.Scanner;public class TCP_File_Client {public static void main(String[] args) { // Scanner scan = null;InputStream in = null;Socket socket = null;try {/*** 1.掃描控制臺接收文件路徑名* 創建一個file引用,指向一個新的File對象,并給文件賦予地址*/// System.out.println("請輸入要傳輸文件的路徑:"); // scan = new Scanner(System.in); // String path = scan.nextLine();File file = new File("D:\\test.txt");/*** 2.判斷文件是文本文件而不是文件夾并且路徑存在* exists():判斷文件是否存在* isFile():判斷是不是文件*/if(file.exists() && file.isFile()) {System.out.println("開始傳輸----->");/*** 3.創建文件輸入流,發送文件* 將文件輸入的內容都放在file里面*/in = new FileInputStream(file);/*** Socket 這個類實現客戶端套接字(也稱為“套接字”)。套接字是兩臺機器間通信的端點。** 4.創建客戶端套接字*/socket = new Socket();//InetSocketAddress Inets = new InetSocketAddress("127.0.0.1", 12345);/*** 5.連接TCP服務器* 確定服務端的IP和端口號*///socket.connect(new InetSocketAddress("9f9fw7dm.dongtaiyuming.net", 14667));socket.connect(new InetSocketAddress("127.0.0.1", 8899));/*** 6.獲取到客戶端的輸出流* OutputStream getOutputStream()* 返回此套接字的輸出流。*/OutputStream out = socket.getOutputStream();/*** 7.向服務器發送文件* 自己定義了一個協議來解決粘包現象,獲取文件名* 7.1.我們先將文件中的內容讀取出來,放到file里面* 7.2.先讀文件名 file.getName()* 7.3.將文件名轉換成字節 file.getName().getBytes()* 7.4.獲取文件名的字節的長度 file.getName().getBytes().length* 7.5.再在文件名長度的后面加上 \r\n 作為標識符*/// 向服務器發送[文件名字節長度 \r\n]out.write((file.getName().getBytes().length + "\r\n").getBytes());// 向服務器發送[文件名字節]out.write(file.getName().getBytes());// 向服務器發送[文件字節長度\r\n]out.write((file.length() + "\r\n").getBytes());// 向服務器發送[文件字節內容]byte[] data = new byte[1024];int i = 0;/*while((i = in.read(data)) != -1) {out.write(data, 0, i);}*/int length = 0;long progress = 0;while((length = in.read(data, 0, data.length)) != -1) {out.write(data, 0, length);out.flush();progress += length;System.out.print("| " + (100*progress/file.length()) + "% |");}System.out.println(" ");}else {System.out.println("文件不存在或者一個文件~~");}} catch (Exception e) {e.printStackTrace();}finally {/*** 關閉Scanner,文件輸入流,套接字* 套接字裝飾了輸出流,所以不用關閉輸出流*/ // if(scan != null) { // scan.close(); // }try {if(in != null) {in.close();}} catch (IOException e) {e.printStackTrace();}finally {// 強制將輸入流置為空in = null;}try {if(socket != null) {socket.close();}} catch (IOException e) {e.printStackTrace();}finally {// 強制釋放socketsocket = null;}}System.out.println("文件傳輸完畢");} }

服務端:

package TCP;import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket;public class TCP_File_Server {public static void main(String[] args) throws Exception {/*** 創建服務端套接字*/ServerSocket ss = new ServerSocket();/*** 綁定指定端口*/ss.bind(new InetSocketAddress(8899));System.out.println("------開始接收文件-------");/*** 監聽并接受客戶端socket連接,并返回一個socket*//*** 持續接收客戶端發來的信息,并交給線程處理*/while(true) {Socket socket = ss.accept();new Thread(new UpLoad(socket)).start();}} }class UpLoad implements Runnable{private Socket socket = null;public UpLoad(Socket socket) {this.socket = socket;}@Overridepublic void run() {OutputStream out = null;try {// 創建文件輸入流,接收客戶端的socket中的文件流InputStream in = socket.getInputStream();/*** 獲取文件名長度* 文件格式:文件名長度(數字)\r\文件名\r\n文件內容\r\n* 獲取文件名 - 讀到第一個回車換行之前 截取出文件名的長度 接著讀取這個長度的字節 就是文件名* 讀取數據 直到遇到第一個回車換行* 每次從流中讀取一個字節 轉成字符串 拼到line上 只要line還不是\r\n結尾 就重復這個過程*/String line1 = "";byte[] by1 = new byte[1];while(!line1.endsWith("\r\n")) {in.read(by1);String str = new String(by1);line1 += str;}/*** 1.讀到長度,去掉\r\n就是文件名字的長度* 2.parseInt():作用是將可分析的字符串轉化為整數。* 3.substring():返回一個新字符串,它是此字符串的一個子字符串。*/int len1 = Integer.parseInt(line1.substring(0, line1.length() - 2));/*** 1.讀取文件名* 2.先創建一個長度和文件名長度相等的字節數組,用來存放文件名* 3.read(data):從輸入流中讀取一定數量的字節,并將其存儲在緩沖區數組 data 中* data數組有多大,就在in輸入流里面讀取多少內容,并將內容存放在data數組里面*/byte[] data = new byte[len1];in.read(data);String fileName = new String(data);// 獲取文件內容字節長度String line2 = "";byte[] by2 = new byte[1];while(!line2.endsWith("\r\n")) {in.read(by2);String str = new String(by2);line2 += str;}int len2 = Integer.parseInt(line2.substring(0, line2.length() - 2));// 創建輸文件出流,指定文件輸出地址String path = "D://copy//" + fileName;out = new FileOutputStream(path);// 獲取文件內容字節// 流對接byte[] by3 = new byte[len2];in.read(by3);out.write(by3);System.out.println("接受到來自"+socket.getInetAddress().getHostAddress()+"上傳的文件"+path);} catch (IOException e) {e.printStackTrace();}finally {// 關閉資源// 關閉輸出流try {if(out != null) {out.close();}} catch (IOException e) {e.printStackTrace();}finally {out = null;}// 關閉sockettry {if(socket != null) {socket.close();}} catch (IOException e) {e.printStackTrace();}finally {socket = null;}}} }

UDP

(客戶端)

package upd;import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.Socket;public class FileTransferClient extends Socket {private static final String SERVER_IP = "127.0.0.1"; // 服務端IPprivate static final int SERVER_PORT = 8899; // 服務端端口private Socket client;private FileInputStream fis;private DataOutputStream dos;/*** 構造函數<br/>* 與服務器建立連接* @throws Exception*/public FileTransferClient() throws Exception {super(SERVER_IP, SERVER_PORT);this.client = this;System.out.println("Cliect[port:" + client.getLocalPort() + "] 成功連接服務端");}/*** 向服務端傳輸文件* @throws Exception*/public void sendFile() throws Exception {try {File file = new File("D:\\test.xlsx");if(file.exists()) {fis = new FileInputStream(file);dos = new DataOutputStream(client.getOutputStream());// 文件名和長度dos.writeUTF(file.getName());dos.flush();dos.writeLong(file.length());dos.flush();// 開始傳輸文件System.out.println("======== 開始傳輸文件 ========");byte[] bytes = new byte[1024];int length = 0;long progress = 0;while((length = fis.read(bytes, 0, bytes.length)) != -1) {dos.write(bytes, 0, length);dos.flush();progress += length;System.out.print("| " + (100*progress/file.length()) + "% |");}System.out.println();System.out.println("======== 文件傳輸成功 ========");dos.close();}} catch (Exception e) {e.printStackTrace();} finally {if(fis != null)fis.close();if(dos != null)dos.close();client.close();}}/*** 入口* @param args*/public static void main(String[] args) {try {FileTransferClient client = new FileTransferClient(); // 啟動客戶端連接client.sendFile(); // 傳輸文件} catch (Exception e) {e.printStackTrace();}} } 服務端: package upd; import java.io.DataInputStream; import java.io.File; import java.io.FileOutputStream; import java.math.RoundingMode; import java.net.ServerSocket; import java.net.Socket; import java.text.DecimalFormat;/*** 文件傳輸Server端<br>* 功能說明:** @author 大智若愚的小懂* @Date 2016年09月01日* @version 1.0*/ public class FileTransferServer extends ServerSocket {private static final int SERVER_PORT = 8899; // 服務端端口private static DecimalFormat df = null;static {// 設置數字格式,保留一位有效小數df = new DecimalFormat("#0.0");df.setRoundingMode(RoundingMode.HALF_UP);df.setMinimumFractionDigits(1);df.setMaximumFractionDigits(1);}public FileTransferServer() throws Exception {super(SERVER_PORT);}/*** 使用線程處理每個客戶端傳輸的文件* @throws Exception*/public void load() throws Exception {System.out.println("服務端已啟動,等待接收文件......");while (true) {// server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的Socket socket = this.accept();/*** 我們的服務端處理客戶端的連接請求是同步進行的, 每次接收到來自客戶端的連接請求后,* 都要先跟當前的客戶端通信完之后才能再處理下一個連接請求。 這在并發比較多的情況下會嚴重影響程序的性能,* 為此,我們可以把它改為如下這種異步處理與客戶端通信的方式*/// 每接收到一個Socket就建立一個新的線程來處理它new Thread(new Task(socket)).start();}}/*** 處理客戶端傳輸過來的文件線程類*/class Task implements Runnable {private Socket socket;private DataInputStream dis;private FileOutputStream fos;public Task(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {dis = new DataInputStream(socket.getInputStream());// 文件名和長度String fileName = dis.readUTF();long fileLength = dis.readLong();File directory = new File("D:\\copy");if(!directory.exists()) {directory.mkdir();}File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);fos = new FileOutputStream(file);// 開始接收文件byte[] bytes = new byte[1024];int length = 0;while((length = dis.read(bytes, 0, bytes.length)) != -1) {fos.write(bytes, 0, length);fos.flush();}System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");} catch (Exception e) {e.printStackTrace();} finally {try {if(fos != null)fos.close();if(dis != null)dis.close();socket.close();} catch (Exception e) {}}}}/*** 格式化文件大小* @param length* @return*/private String getFormatFileSize(long length) {double size = ((double) length) / (1 << 30);if(size >= 1) {return df.format(size) + "GB";}size = ((double) length) / (1 << 20);if(size >= 1) {return df.format(size) + "MB";}size = ((double) length) / (1 << 10);if(size >= 1) {return df.format(size) + "KB";}return length + "B";}/*** 入口* @param args*/public static void main(String[] args) {try {FileTransferServer server = new FileTransferServer(); // 啟動服務端server.load();} catch (Exception e) {e.printStackTrace();}} }傳輸時先啟動服務端

?

總結

以上是生活随笔為你收集整理的Java 文件传输 (TCP、UDP)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。