Java でソケット経由でファイルを正しく転送するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-03 13:59:31
オリジナル
288 人が閲覧しました

How to Correctly Transfer Files Over Sockets in Java?

ソケット経由の 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート