Contoh dalam artikel ini menjelaskan metode menyalin file antara dua server di Java. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
Biasanya fungsi penyalinan file yang paling sering kita gunakan adalah fungsi penyalinan file antara server yang sama. Yang diperkenalkan di sini adalah peningkatan fungsi penyalinan file biasa, yang dapat mewujudkan penyalinan file antara dua server.
1. Sisi server
Copy kode sebagai berikut: paket buritan;
impor java.io.BufferedInputStream;
impor java.io.DataInputStream;
impor java.io.DataOutputStream;
impor java.io.File;
impor java.io.FileInputStream;
impor java.net.ServerSocket;
impor java.net.Socket;
Tes Server kelas publik {
int pelabuhan = 8821;
batal mulai() {
Soket s = nol;
mencoba {
ServerSocket ss = ServerSocket baru(pelabuhan);
sementara (benar) {
//Pilih file untuk ditransfer
String filePath = "D://lib.rar";
File fi = File baru(filePath);
System.out.println("Panjang file:" + (int) fi.length());
// Socket publik menerima() lemparan
// IOException mendengarkan dan menerima koneksi ke soket ini. Metode ini memblokir hingga koneksi dibuat.
s = ss.accept();
System.out.println("Buat koneksi soket");
DataInputStream dis = DataInputStream baru(New BufferedInputStream(s.getInputStream()));
dis.readByte();
DataInputStream fis = DataInputStream baru(BufferedInputStream baru(FileInputStream baru(filePath)));
DataOutputStream ps = DataOutputStream baru(s.getOutputStream());
//Kirimkan nama dan panjang file ke klien. Agar benar-benar dapat diterapkan di semua platform, pemrosesan nama Cina misalnya masih memerlukan pemrosesan. Untuk lebih jelasnya silakan merujuk ke kode yang sudah jadi di Think In Java 4th.
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((panjang) fi.panjang());
ps.flush();
int ukuran buffer = 8192;
byte[] buf = byte baru[ukuran buffer];
sementara (benar) {
int baca = 0;
jika (fis != null) {
baca = fis.baca(buf);
}
jika (baca == -1) {
merusak;
}
ps.write(buf, 0, baca);
}
ps.flush();
// Hati-hati saat menutup link soket, jika tidak klien akan menunggu data dari server.
// Hingga waktu soket habis, mengakibatkan data tidak lengkap.
fis.close();
s.close();
System.out.println("Transfer file selesai");
}
} tangkapan (Pengecualian e) {
e.printStackTrace();
}
}
public static void main(String arg[]) {
ServerTest baru().start();
}
}
2. Gunakan soket kelas tambahan
Copy kode sebagai berikut: paket buritan;
impor java.net.*;
import java.io.*;
ClientSocket kelas publik {
ip String pribadi;
port int pribadi;
soket soket pribadi = null;
DataOutputStream keluar = null;
DataInputStream getMessageStream = null;
ClientSocket publik(String ip, port int) {
ini.ip = ip;
this.port = pelabuhan;
}
/** *//**
* Buat koneksi soket
*
* @throwsException
* pengecualian
*/
public void CreateConnection() memunculkan Pengecualian {
mencoba {
soket = Soket baru(ip, port);
} tangkapan (Pengecualian e) {
e.printStackTrace();
jika (soket != null)
soket.close();
melempar e;
} Akhirnya {
}
}
public void sendMessage(String sendMessage) memunculkan Pengecualian {
mencoba {
keluar = DataOutputStream baru(socket.getOutputStream());
if (sendMessage.equals("Windows")) {
keluar.writeByte(0x1);
keluar.flush();
kembali;
}
if (sendMessage.equals("Unix")) {
keluar.writeByte(0x2);
keluar.flush();
kembali;
}
if (sendMessage.equals("Linux")) {
keluar.writeByte(0x3);
keluar.flush();
} kalau tidak {
keluar.writeUTF(sendMessage);
keluar.flush();
}
} tangkapan (Pengecualian e) {
e.printStackTrace();
jika (keluar!= nol)
keluar.dekat();
melempar e;
} Akhirnya {
}
}
public DataInputStream getMessageStream() memunculkan Pengecualian {
mencoba {
getMessageStream = DataInputStream baru(BufferedInputStream baru(socket.getInputStream()));
kembalikan getMessageStream;
} tangkapan (Pengecualian e) {
e.printStackTrace();
jika (getMessageStream != nol)
getMessageStream.close();
melempar e;
} Akhirnya {
}
}
kekosongan publik shutDownConnection() {
mencoba {
jika (keluar!= nol)
keluar.dekat();
jika (getMessageStream != nol)
getMessageStream.close();
jika (soket != null)
soket.close();
} tangkapan (Pengecualian e) {
}
}
}
3.Klien
Copy kode sebagai berikut: paket buritan;
impor java.io.BufferedOutputStream;
impor java.io.DataInputStream;
impor java.io.DataOutputStream;
impor java.io.FileOutputStream;
Tes Klien kelas publik {
ClientSocket cs pribadi = null;
private String ip = "localhost";//Setel ke IP server private int port = 8821;
pribadi String sendMessage = "Windwos";
Tes Klien publik() {
mencoba {
jika (buatKoneksi()) {
kirimPesan();
dapatkan Pesan();
}
} catch (Pengecualian misalnya) {
ex.printStackTrace();
}
}
boolean pribadi createConnection() {
cs = ClientSocket baru(ip, port);
mencoba {
cs.CreateConnection();
System.out.print("Koneksi ke server berhasil!" + "/n");
kembali benar;
} tangkapan (Pengecualian e) {
System.out.print("Gagal terhubung ke server!" + "/n");
kembali salah;
}
}
kekosongan pribadi sendMessage() {
jika (cs == nol)
kembali;
mencoba {
cs.sendMessage(sendMessage);
} tangkapan (Pengecualian e) {
System.out.print("Gagal mengirim pesan!" + "/n");
}
}
kekosongan pribadi getMessage() {
jika (cs == nol)
kembali;
DataInputStream inputStream = null;
mencoba {
inputStream = cs.getMessageStream();
} tangkapan (Pengecualian e) {
System.out.print("kesalahan cache menerima pesan/n");
kembali;
}
mencoba {
//Jalur penyimpanan lokal, nama file akan secara otomatis diwarisi dari server.
String simpanPath = "E://";
int ukuran buffer = 8192;
byte[] buf = byte baru[ukuran buffer];
int passlen = 0;
panjanglen=0;
savePath += inputStream.readUTF();
DataOutputStream fileOut = DataOutputStream baru(BufferedOutputStream baru(BufferedOutputStream baru(FileOutputStream baru(savePath))));
len = inputStream.readLong();
System.out.println("Panjang file adalah:" + len + "/n");
System.out.println("Mulai menerima file!" + "/n");
sementara (benar) {
int baca = 0;
jika (aliran masukan!= nol) {
baca = inputStream.baca(buf);
}
berlalu += membaca;
jika (baca == -1) {
merusak;
}
//Bilah kemajuan di bawah ini awalnya dibuat untuk prograssBar antarmuka grafis. Jika Anda mencetak file di sini, beberapa persentase yang sama mungkin dicetak berulang kali.
System.out.println("File diterima" + (lulus * 100/ len) + "%/n");
fileOut.write(buf, 0, baca);
}
System.out.println("Penerimaan selesai, file disimpan sebagai" + savePath + "/n");
fileOut.close();
} tangkapan (Pengecualian e) {
System.out.println("Kesalahan dalam menerima pesan" + "/n");
kembali;
}
}
public static void main(String arg[]) {
Uji Klien baru();
}
}
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.