この記事の例では、Java で 2 つのサーバー間でファイルをコピーする方法を説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです。
通常、私たちが最もよく使うファイルコピー機能は、同一サーバー間のファイルコピー機能ですが、ここで紹介するのは、2つのサーバー間でのファイルコピーを実現するための、通常のファイルコピー機能のコードを見てみましょう。
1.サーバー側
次のようにコードをコピーします。
インポートjava.io.BufferedInputStream;
インポートjava.io.DataInputStream;
java.io.DataOutputStreamをインポートします。
java.io.ファイルをインポートします。
java.io.FileInputStreamをインポートします。
java.net.ServerSocketをインポートします。
java.net.Socketをインポートします。
パブリック クラス ServerTest {
int ポート = 8821;
void start() {
ソケット s = null;
試す {
ServerSocket ss = 新しい ServerSocket(ポート);
while (true) {
//転送するファイルを選択
文字列ファイルパス = "D://lib.rar";
ファイル fi = 新しいファイル(ファイルパス);
System.out.println("ファイルの長さ:" + (int) fi.length());
// public Socket accept() がスローされる
// IOException は、このソケットへの接続をリッスンして受け入れます。このメソッドは、接続が確立されるまでブロックします。
s = ss.accept();
System.out.println("ソケット接続の確立");
DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
dis.readByte();
DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
DataOutputStream ps = new DataOutputStream(s.getOutputStream());
//ファイル名と長さをクライアントに送信します。すべてのプラットフォームに真に適用するには、たとえば中国語名の処理が必要です。詳細については、「Think In Java 4th」の既製のコードを参照してください。
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((long) fi.length());
ps.flush();
int バッファサイズ = 8192;
byte[] buf = 新しいバイト[バッファサイズ];
while (true) {
int 読み取り = 0;
if (fis != null) {
読み取り = fis.read(buf);
}
if (読み取り == -1) {
壊す;
}
ps.write(buf, 0, read);
}
ps.flush();
// ソケット リンクを閉じるように注意してください。閉じないと、クライアントはサーバーからのデータを待機することになります。
// ソケットがタイムアウトしてデータが不完全になるまで。
fis.close();
s.close();
System.out.println("ファイル転送が完了しました");
}
} catch (例外 e) {
e.printStackTrace();
}
}
public static void main(String arg[]) {
新しい ServerTest().start();
}
}
2. ソケットの補助クラスの利用
次のようにコードをコピーします。
java.net.* をインポートします。
java.io.* をインポートします。
パブリック クラス ClientSocket {
プライベート文字列IP;
プライベート int ポート。
プライベートソケットソケット = null;
DataOutputStream 出力 = null;
DataInputStream getMessageStream = null;
public ClientSocket(String ip, int port) {
this.ip = ip;
this.port = ポート;
}
/** *//**
* ソケット接続の作成
*
* @throwsException
* 例外
*/
public void CreateConnection() が例外をスローする {
試す {
ソケット = 新しいソケット(ip, ポート);
} catch (例外 e) {
e.printStackTrace();
if (ソケット != null)
ソケット.クローズ();
eを投げます。
} ついに {
}
}
public void sendMessage(String sendMessage) は例外をスローします {
試す {
out = 新しい DataOutputStream(socket.getOutputStream());
if (sendMessage.equals("Windows")) {
out.writeByte(0x1);
out.flush();
戻る;
}
if (sendMessage.equals("Unix")) {
out.writeByte(0x2);
out.flush();
戻る;
}
if (sendMessage.equals("Linux")) {
out.writeByte(0x3);
out.flush();
} それ以外 {
out.writeUTF(sendMessage);
out.flush();
}
} catch (例外 e) {
e.printStackTrace();
if (out != null)
out.close();
eを投げます。
} ついに {
}
}
public DataInputStream getMessageStream() が例外をスローする {
試す {
getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
getMessageStream を返します。
} catch (例外 e) {
e.printStackTrace();
if (getMessageStream != null)
getMessageStream.close();
eを投げます。
} ついに {
}
}
public void shutDownConnection() {
試す {
if (out != null)
out.close();
if (getMessageStream != null)
getMessageStream.close();
if (ソケット != null)
ソケット.クローズ();
} catch (例外 e) {
}
}
}
3.クライアント
次のようにコードをコピーします。
インポート java.io.BufferedOutputStream;
インポートjava.io.DataInputStream;
java.io.DataOutputStreamをインポートします。
java.io.FileOutputStreamをインポートします。
パブリック クラス ClientTest {
プライベート ClientSocket cs = null;
private String ip = "localhost";//サーバー IP に設定 private int port = 8821;
private String sendMessage = "Windwos";
public ClientTest() {
試す {
if (createConnection()) {
sendMessage();
getMessage();
}
} catch (例外例) {
ex.printStackTrace();
}
}
private boolean createConnection() {
cs = 新しい ClientSocket(ip, port);
試す {
cs.CreateConnection();
System.out.print("サーバーへの接続に成功しました!" + "/n");
true を返します。
} catch (例外 e) {
System.out.print("サーバーへの接続に失敗しました!" + "/n");
false を返します。
}
}
private void sendMessage() {
if (cs == null)
戻る;
試す {
cs.sendMessage(sendMessage);
} catch (例外 e) {
System.out.print("メッセージの送信に失敗しました!" + "/n");
}
}
private void getMessage() {
if (cs == null)
戻る;
DataInputStream 入力ストリーム = null;
試す {
inputStream = cs.getMessageStream();
} catch (例外 e) {
System.out.print("受信メッセージ キャッシュ エラー/n");
戻る;
}
試す {
//ローカルの保存パス。ファイル名はサーバーから自動的に継承されます。
文字列保存パス = "E://";
int バッファサイズ = 8192;
byte[] buf = 新しいバイト[バッファサイズ];
int passlen = 0;
ロングレン=0;
savePath += inputStream.readUTF();
DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));
len = inputStream.readLong();
System.out.println("ファイルの長さは次のとおりです:" + len + "/n");
System.out.println("ファイルの受信を開始します!" + "/n");
while (true) {
int 読み取り = 0;
if (inputStream != null) {
読み取り = inputStream.read(buf);
}
passlen += 読み取り;
if (読み取り == -1) {
壊す;
}
//以下の進行状況バーは、もともとグラフィカル インターフェイスの prograssBar 用に作成されたものです。ここでファイルを印刷している場合、同じパーセンテージの一部が繰り返し印刷される可能性があります。
System.out.println("受信したファイル" + (passedlen * 100/ len) + "%/n");
fileOut.write(buf, 0, read);
}
System.out.println("受信完了、ファイル保存名" + savePath + "/n");
fileOut.close();
} catch (例外 e) {
System.out.println("メッセージ受信エラー" + "/n");
戻る;
}
}
public static void main(String arg[]) {
新しい ClientTest();
}
}
この記事が皆さんの Java プログラミングに役立つことを願っています。