ตัวอย่างในบทความนี้อธิบายวิธีการคัดลอกไฟล์ระหว่างสองเซิร์ฟเวอร์ใน Java แบ่งปันกับทุกคนสำหรับการอ้างอิงของคุณ การวิเคราะห์เฉพาะมีดังนี้:
โดยปกติแล้วฟังก์ชันการคัดลอกไฟล์ที่เราใช้มากที่สุดคือฟังก์ชันการคัดลอกไฟล์ระหว่างเซิร์ฟเวอร์เดียวกัน สิ่งที่แนะนำที่นี่คือการอัพเกรดการทำงานของการคัดลอกไฟล์ธรรมดา ซึ่งสามารถรับรู้ถึงการคัดลอกไฟล์ระหว่างเซิร์ฟเวอร์สองเครื่อง มาดูโค้ดกัน
1. ฝั่งเซิร์ฟเวอร์
คัดลอกโค้ดดังต่อไปนี้: แพ็กเกจ Sterning;
นำเข้า java.io.BufferedInputStream;
นำเข้า java.io.DataInputStream;
นำเข้า java.io.DataOutputStream;
นำเข้า java.io.File;
นำเข้า java.io.FileInputStream;
นำเข้า java.net.ServerSocket;
นำเข้า java.net.Socket;
ServerTest ระดับสาธารณะ {
พอร์ต int = 8821;
เป็นโมฆะเริ่มต้น () {
ซ็อกเก็ต s = null;
พยายาม {
ServerSocket ss = ServerSocket ใหม่ (พอร์ต);
ในขณะที่ (จริง) {
//เลือกไฟล์ที่จะถ่ายโอน
สตริง filePath = "D://lib.rar";
ไฟล์ fi = ไฟล์ใหม่ (filePath);
System.out.println("ความยาวไฟล์:" + (int) fi.length());
// ซ็อกเก็ตสาธารณะยอมรับ () พ่น
// IOException รับฟังและยอมรับการเชื่อมต่อกับซ็อกเก็ตนี้ วิธีการนี้จะบล็อกจนกว่าจะมีการเชื่อมต่อ
s = ss.ยอมรับ();
System.out.println("สร้างการเชื่อมต่อซ็อกเก็ต");
DataInputStream dis = DataInputStream ใหม่ (BufferedInputStream ใหม่ (s.getInputStream()));
dis.readByte();
DataInputStream fis = DataInputStream ใหม่ (BufferedInputStream ใหม่ (FileInputStream ใหม่ (filePath))));
DataOutputStream ps = DataOutputStream ใหม่ (s.getOutputStream());
//ส่งชื่อไฟล์และความยาวไปยังไคลเอนต์ เพื่อให้ใช้ได้กับทุกแพลตฟอร์มอย่างแท้จริง เช่น การประมวลผลชื่อภาษาจีน ยังคงต้องมีการประมวลผล สำหรับรายละเอียด โปรดดูโค้ดสำเร็จรูปใน Think In Java 4th
ps.writeUTF(fi.getName());
PS.ฟลัช();
ps.writeLong((ยาว) fi.length());
PS.ฟลัช();
ขนาดบัฟเฟอร์ int = 8192;
ไบต์ [] buf = ไบต์ใหม่ [bufferSize];
ในขณะที่ (จริง) {
int อ่าน = 0;
ถ้า (fis != null) {
อ่าน = fis.read(buf);
-
ถ้า (อ่าน == -1) {
หยุดพัก;
-
ปล.write(buf, 0, อ่าน);
-
PS.ฟลัช();
// โปรดใช้ความระมัดระวังในการปิดลิงก์ซ็อกเก็ต ไม่เช่นนั้นไคลเอนต์จะรอข้อมูลจากเซิร์ฟเวอร์
// จนกระทั่งซ็อกเก็ตหมดเวลาส่งผลให้ข้อมูลไม่สมบูรณ์
fis.ปิด();
s.ปิด();
System.out.println("การถ่ายโอนไฟล์เสร็จสมบูรณ์");
-
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
-
-
โมฆะคงที่สาธารณะ main (String arg []) {
ใหม่ ServerTest().start();
-
-
2. ใช้คลาสเสริมของซ็อกเก็ต
คัดลอกโค้ดดังต่อไปนี้: แพ็กเกจ Sterning;
นำเข้า java.net.*;
นำเข้า java.io.*;
ClientSocket ระดับสาธารณะ {
สตริงไอพีส่วนตัว;
พอร์ต int ส่วนตัว
ซ็อกเก็ตซ็อกเก็ตส่วนตัว = null;
DataOutputStream ออก = null;
DataInputStream getMessageStream = null;
ClientSocket สาธารณะ (สตริง ip, พอร์ต int) {
นี่.ip = ip;
this.port = พอร์ต;
-
-
* สร้างการเชื่อมต่อซ็อกเก็ต
-
* @throwsException
* ข้อยกเว้น
-
โมฆะสาธารณะ CreateConnection () พ่นข้อยกเว้น {
พยายาม {
ซ็อกเก็ต = ซ็อกเก็ตใหม่ (ip, พอร์ต);
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
ถ้า (ซ็อกเก็ต != null)
ซ็อกเก็ต.ปิด();
โยนอี;
} ในที่สุด {
-
-
โมฆะสาธารณะ sendMessage (สตริง sendMessage) พ่นข้อยกเว้น {
พยายาม {
ออก = DataOutputStream ใหม่ (socket.getOutputStream());
ถ้า (sendMessage.equals("Windows")) {
ออก.writeByte(0x1);
ออก.ล้าง();
กลับ;
-
ถ้า (sendMessage.equals("Unix")) {
ออกwriteByte(0x2);
ออก.ล้าง();
กลับ;
-
ถ้า (sendMessage.equals("Linux")) {
ออก.writeByte(0x3);
ออก.ล้าง();
} อื่น {
out.writeUTF(ส่งข้อความ);
ออก.ล้าง();
-
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
ถ้า (ออก != null)
ออก.ปิด();
โยนอี;
} ในที่สุด {
-
-
DataInputStream สาธารณะ getMessageStream () พ่นข้อยกเว้น {
พยายาม {
getMessageStream = DataInputStream ใหม่ (BufferedInputStream ใหม่ (socket.getInputStream()));
กลับ getMessageStream;
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
ถ้า (getMessageStream != null)
getMessageStream.close();
โยนอี;
} ในที่สุด {
-
-
โมฆะสาธารณะshutDownConnection() {
พยายาม {
ถ้า (ออก != null)
ออก.ปิด();
ถ้า (getMessageStream != null)
getMessageStream.close();
ถ้า (ซ็อกเก็ต != null)
ซ็อกเก็ต.ปิด();
} จับ (ข้อยกเว้นจ) {
-
-
-
3.ลูกค้า
คัดลอกโค้ดดังต่อไปนี้: แพ็กเกจ Sterning;
นำเข้า java.io.BufferedOutputStream;
นำเข้า java.io.DataInputStream;
นำเข้า java.io.DataOutputStream;
นำเข้า java.io.FileOutputStream;
ClientTest ระดับสาธารณะ {
ClientSocket ส่วนตัว cs = null;
สตริงส่วนตัว ip = "localhost";//ตั้งค่าเป็นเซิร์ฟเวอร์ IP ส่วนตัวพอร์ต int = 8821;
สตริงส่วนตัว sendMessage = "Windwos";
การทดสอบลูกค้าสาธารณะ () {
พยายาม {
ถ้า (createConnection()) {
ส่งข้อความ();
รับข้อความ();
-
} จับ (ข้อยกเว้นเช่น) {
เช่น printStackTrace();
-
-
createConnection บูลีนส่วนตัว () {
cs = ClientSocket ใหม่ (ip, พอร์ต);
พยายาม {
cs.สร้างการเชื่อมต่อ();
System.out.print("เชื่อมต่อกับเซิร์ฟเวอร์สำเร็จ!" + "/n");
กลับเป็นจริง;
} จับ (ข้อยกเว้นจ) {
System.out.print("ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์!" + "/n");
กลับเท็จ;
-
-
โมฆะส่วนตัว sendMessage() {
ถ้า (cs == โมฆะ)
กลับ;
พยายาม {
cs.sendMessage(ส่งข้อความ);
} จับ (ข้อยกเว้นจ) {
System.out.print("ไม่สามารถส่งข้อความได้!" + "/n");
-
-
โมฆะส่วนตัว getMessage () {
ถ้า (cs == โมฆะ)
กลับ;
DataInputStream inputStream = null;
พยายาม {
inputStream = cs.getMessageStream();
} จับ (ข้อยกเว้นจ) {
System.out.print("การรับแคชข้อความผิดพลาด/n");
กลับ;
-
พยายาม {
//เส้นทางบันทึกในเครื่อง ชื่อไฟล์จะได้รับการสืบทอดจากเซิร์ฟเวอร์โดยอัตโนมัติ
สตริง savePath = "E://";
ขนาดบัฟเฟอร์ int = 8192;
ไบต์ [] buf = ไบต์ใหม่ [bufferSize];
int ผ่าน = 0;
ลองเลน=0;
savePath += inputStream.readUTF();
DataOutputStream fileOut = DataOutputStream ใหม่ (BufferedOutputStream ใหม่ (BufferedOutputStream ใหม่ (FileOutputStream ใหม่ (savePath)))));
len = inputStream.readLong();
System.out.println("ความยาวของไฟล์คือ:" + len + "/n");
System.out.println("เริ่มรับไฟล์!" + "/n");
ในขณะที่ (จริง) {
int อ่าน = 0;
ถ้า (inputStream != null) {
อ่าน = inputStream.read (buf);
-
passlen += อ่าน;
ถ้า (อ่าน == -1) {
หยุดพัก;
-
//แถบความคืบหน้าด้านล่างเดิมสร้างขึ้นสำหรับ prograssBar ของอินเทอร์เฟซแบบกราฟิก หากคุณกำลังพิมพ์ไฟล์ที่นี่ เปอร์เซ็นต์เดียวกันบางส่วนอาจถูกพิมพ์ซ้ำๆ
System.out.println("ไฟล์ที่ได้รับ" + (ผ่าน * 100/ len) + "%/n");
fileOut.write (buf, 0, อ่าน);
-
System.out.println("การรับเสร็จสมบูรณ์ บันทึกไฟล์เป็น" + savePath + "/n");
fileOut.close();
} จับ (ข้อยกเว้นจ) {
System.out.println("ข้อผิดพลาดในการรับข้อความ" + "/n");
กลับ;
-
-
โมฆะคงที่สาธารณะ main (String arg []) {
ใหม่ ClientTest();
-
-
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน