ソケット経由の Java ファイル転送: バイト配列の送受信
Java では、ソケット経由でファイルを転送するには、ファイルをバイト配列に変換する必要があります。ソケット経由でバイトを送信し、受信側でバイトをファイルに変換して戻します。この記事では、このファイル転送機能を実装する際に Java 開発者が遭遇した問題について説明します。
サーバー側の問題
サーバー コードは、受信時に空のファイルを作成するようですクライアントからのデータ。これを解決するには、サーバーはループを使用してクライアントから送信されたデータをチャンクで読み取り、データを一時的に保存するバッファーを使用する必要があります。すべてのデータを受信すると、サーバーは完全なファイルを書き込むことができます。修正されたサーバー コードは次のとおりです。
<code class="java">byte[] buffer = new byte[1024]; int bytesRead = 0; while ((bytesRead = in.read(buffer)) != -1) { fos.write(buffer, 0, bytesRead); }</code>
クライアント側の問題
クライアント コードは、最初に空のバイト配列をサーバーに送信します。実際のファイルの内容を送信するには、次のコードを使用する必要があります:
<code class="java">FileInputStream is = new FileInputStream(file); byte[] bytes = new byte[(int) length]; is.read(bytes); out.write(bytes);</code>
改良されたコード
前述の修正により、サーバーとクライアントの完全なコードは次のようになります。次のように:
サーバー:
<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>
クライアント:
<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>
以上がJava でソケット経由でファイルを正しく転送するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。