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!