يصف المثال الموجود في هذه المقالة طريقة نسخ الملفات بين خادمين في Java. شاركها مع الجميع لتكون مرجعا لك. التحليل المحدد هو كما يلي:
عادةً ما تكون وظيفة نسخ الملفات التي نستخدمها كثيرًا هي وظيفة نسخ الملفات بين نفس الخوادم، وما يتم تقديمه هنا هو الترقية الوظيفية لنسخ الملفات العادية، والتي يمكنها تحقيق نسخ الملفات بين خادمين.
1. جانب الخادم
انسخ الكود كما يلي: package sterning;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
استيراد java.io.File؛
import java.io.FileInputStream;
import java.net.ServerSocket;
استيراد java.net.Socket؛
اختبار خادم الطبقة العامة {
منفذ إنت = 8821؛
بداية باطلة () {
المقبس s = فارغ؛
يحاول {
ServerSocket ss = new ServerSocket(port);
بينما (صحيح) {
// حدد الملفات للنقل
سلسلة ملف المسار = "D://lib.rar"؛
File fi = new File(filePath);
System.out.println("طول الملف:" + (int) fi. length());
// يقبل المقبس العام () رميات
// IOException يستمع ويقبل الاتصالات بهذا المقبس. تحظر هذه الطريقة حتى يتم إجراء الاتصال.
s = ss.accept();
System.out.println("إنشاء اتصال بالمأخذ");
DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
readByte();
DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
DataOutputStream ps = new DataOutputStream(s.getOutputStream());
// أرسل اسم الملف وطوله إلى العميل. لكي تكون قابلة للتطبيق حقًا على جميع الأنظمة الأساسية، لا تزال معالجة الأسماء الصينية، على سبيل المثال، تتطلب المعالجة للحصول على التفاصيل، يرجى الرجوع إلى التعليمات البرمجية الجاهزة في Think In Java 4th.
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((طويل) fi. length());
ps.flush();
حجم المخزن المؤقت = 8192؛
byte[] buf = new byte[bufferSize];
بينما (صحيح) {
قراءة كثافة العمليات = 0؛
إذا (فيس! = فارغة) {
قراءة = fis.read(buf);
}
إذا (اقرأ == -1) {
استراحة؛
}
ps.write(buf, 0, read);
}
ps.flush();
// احرص على إغلاق رابط المقبس، وإلا فسينتظر العميل البيانات من الخادم.
// حتى تنتهي مهلة المقبس، مما يؤدي إلى بيانات غير كاملة.
fis. Close();
s. Close();
System.out.println("اكتمل نقل الملف");
}
} قبض (الاستثناء ه) {
printStackTrace();
}
}
public static void main(String arg[]) {
new ServerTest().start();
}
}
2. استخدم فئة المقبس المساعدة
انسخ الكود كما يلي: package sterning;
استيراد java.net.*;
استيراد java.io.*;
الطبقة العامة ClientSocket {
سلسلة الملكية الفكرية الخاصة؛
ميناء خاص؛
مقبس المقبس الخاص = فارغ؛
DataOutputStream out = null;
DataInputStream getMessageStream = null;
public ClientSocket(String ip, int port) {
this.ip = ip;
this.port = port;
}
/** *//**
* إنشاء اتصال مأخذ التوصيل
*
* @throwsException
* استثناء
*/
الفراغ العام CreateConnection() يلقي استثناء {
يحاول {
المقبس = مقبس جديد (ip، منفذ)؛
} قبض (الاستثناء ه) {
printStackTrace();
إذا (المقبس! = فارغ)
المقبس. إغلاق ()؛
رمي ه.
} أخيراً {
}
}
public void sendMessage(String sendMessage) يطرح الاستثناء {
يحاول {
out = new DataOutputStream(socket.getOutputStream());
إذا (sendMessage.equals("Windows")) {
out.writeByte(0x1);
out.flush();
يعود؛
}
إذا (sendMessage.equals("يونيكس")) {
out.writeByte(0x2);
out.flush();
يعود؛
}
إذا (sendMessage.equals("Linux")) {
out.writeByte(0x3);
out.flush();
} آخر {
out.writeUTF(sendMessage);
out.flush();
}
} قبض (الاستثناء ه) {
printStackTrace();
إذا (خارج! = فارغة)
out.Close();
رمي ه.
} أخيراً {
}
}
public DataInputStream getMessageStream() يلقي استثناء {
يحاول {
getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
إرجاع getMessageStream؛
} قبض (الاستثناء ه) {
printStackTrace();
إذا (getMessageStream != فارغة)
getMessageStream. Close();
رمي ه.
} أخيراً {
}
}
public void ShutDownConnection() {
يحاول {
إذا (خارج! = فارغة)
out.Close();
إذا (getMessageStream != فارغة)
getMessageStream. Close();
إذا (المقبس! = فارغ)
المقبس. إغلاق ()؛
} قبض (الاستثناء ه) {
}
}
}
3. العميل
انسخ الكود كما يلي: package sterning;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
اختبار العميل للفئة العامة {
Private ClientSocket cs = null;
سلسلة خاصة ip = "المضيف المحلي"؛// اضبط على عنوان IP الخاص بالخادم Private int port = 8821;
سلسلة خاصة sendMessage = "Windwos";
اختبار العميل العام () {
يحاول {
إذا (إنشاءConnection()) {
sendMessage();
getMessage();
}
} قبض (استثناء على سبيل المثال) {
ex.printStackTrace();
}
}
إنشاء اتصال منطقي خاص () {
cs = new ClientSocket(ip, port);
يحاول {
cs.CreateConnection();
System.out.print("تم الاتصال بالخادم بنجاح!" + "/n");
عودة صحيحة؛
} قبض (الاستثناء ه) {
System.out.print("فشل الاتصال بالخادم!" + "/n");
عودة كاذبة.
}
}
إرسال رسالة باطلة خاصة () {
إذا (CS == فارغة)
يعود؛
يحاول {
cs.sendMessage(sendMessage);
} قبض (الاستثناء ه) {
System.out.print("فشل إرسال الرسالة!" + "/n");
}
}
getMessage باطل خاص () {
إذا (CS == فارغة)
يعود؛
DataInputStream inputStream = null;
يحاول {
inputStream = cs.getMessageStream();
} قبض (الاستثناء ه) {
System.out.print("خطأ في ذاكرة التخزين المؤقت للرسالة المستلمة/n");
يعود؛
}
يحاول {
// مسار الحفظ المحلي، سيتم توريث اسم الملف تلقائيًا من الخادم.
سلسلة savePath = "E://";
حجم المخزن المؤقت = 8192؛
byte[] buf = new byte[bufferSize];
إنت باسلين = 0؛
لونجلين=0;
savePath += inputStream.readUTF();
DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath)));
len = inputStream.readLong();
System.out.println("طول الملف هو:" + len + "/n");
System.out.println("ابدأ في تلقي الملفات!" + "/n");
بينما (صحيح) {
قراءة كثافة العمليات = 0؛
إذا (inputStream ! = فارغة) {
قراءة = inputStream.read(buf);
}
passlen += read;
إذا (اقرأ == -1) {
استراحة؛
}
// تم إنشاء شريط التقدم أدناه في الأصل لشريط التقدم للواجهة الرسومية. إذا كنت تطبع ملفًا هنا، فقد تتم طباعة بعض النسب المئوية نفسها بشكل متكرر.
System.out.println("تم استلام الملف" + (passedlen * 100/ len) + "%/n");
fileOut.write(buf, 0, read);
}
System.out.println("اكتمل الاستقبال، وتم حفظ الملف باسم" + savePath + "/n");
fileOut.Close();
} قبض (الاستثناء ه) {
System.out.println("خطأ في تلقي الرسالة" + "/n");
يعود؛
}
}
public static void main(String arg[]) {
اختبار العميل الجديد () ؛
}
}
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.