Rumah >Java >javaTutorial >Bagaimana untuk Memindahkan Fail ke Soket dengan Betul di Java?

Bagaimana untuk Memindahkan Fail ke Soket dengan Betul di Java?

Susan Sarandon
Susan Sarandonasal
2024-11-03 13:59:31319semak imbas

How to Correctly Transfer Files Over Sockets in Java?

Pemindahan Fail Java melalui Soket: Menghantar dan Menerima Tatasusunan Byte

Di Java, memindahkan fail melalui soket melibatkan penukaran fail kepada tatasusunan bait, menghantarnya melalui soket, dan kemudian menukar bait kembali menjadi fail di hujung penerima. Artikel ini menangani isu yang dihadapi oleh pembangun Java dalam melaksanakan fungsi pemindahan fail ini.

Isu Sebelah Pelayan

Kod pelayan kelihatan seperti mencipta fail kosong apabila menerima data daripada klien. Untuk menyelesaikan masalah ini, pelayan harus menggunakan gelung untuk membaca data yang dihantar oleh klien dalam ketulan, menggunakan penimbal untuk menyimpan data buat sementara waktu. Setelah semua data telah diterima, pelayan boleh menulis fail lengkap. Kod pelayan yang diperbetulkan adalah seperti berikut:

<code class="java">byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
    fos.write(buffer, 0, bytesRead);
}</code>

Isu Sampingan Pelanggan

Kod klien pada mulanya menghantar tatasusunan bait kosong ke pelayan. Untuk menghantar kandungan fail sebenar, kod berikut hendaklah digunakan:

<code class="java">FileInputStream is = new FileInputStream(file);
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);</code>

Kod Yang Diperbaiki

Dengan pembetulan yang dinyatakan di atas, kod penuh untuk pelayan dan klien ialah seperti berikut:

Pelayan:

<code class="java">...
byte[] buffer = new byte[1024];
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

FileOutputStream fos = new FileOutputStream("C:\test2.xml");
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
    fos.write(buffer, 0, bytesRead);
}
fos.close();
...</code>

Pelanggan:

<code class="java">...
Socket socket = new Socket(host, 4444);
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

File file = new File("C:\test.xml");
FileInputStream is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
    System.out.println("File is too large.");
}
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);
...</code>

Atas ialah kandungan terperinci Bagaimana untuk Memindahkan Fail ke Soket dengan Betul di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn