ソケット経由の Java ファイル転送: バイト配列の送受信
Java では、ソケット経由でファイルを転送するには、ファイルをバイト配列に変換する必要があります。ソケット経由でバイトを送信し、受信側でバイトをファイルに変換して戻します。この記事では、このファイル転送機能を実装する際に Java 開発者が遭遇した問題について説明します。
サーバー側の問題
サーバー コードは、受信時に空のファイルを作成するようですクライアントからのデータ。これを解決するには、サーバーはループを使用してクライアントから送信されたデータをチャンクで読み取り、データを一時的に保存するバッファーを使用する必要があります。すべてのデータを受信すると、サーバーは完全なファイルを書き込むことができます。修正されたサーバー コードは次のとおりです。
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
クライアント側の問題
クライアント コードは、最初に空のバイト配列をサーバーに送信します。実際のファイルの内容を送信するには、次のコードを使用する必要があります。
FileInputStream is = new FileInputStream(file);
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);
改善されたコード
前述の修正により、サーバーとクライアントの完全なコードは次のようになります:
サーバ:
...
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();
...
クライアント:
...
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);
...
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3