javaファイルのブレークポイント転送の簡易実装
2022-02-28 18:46:30
少し前に、javaのクズである私が、javaを使って簡単なファイルブレークポイント転送を実装することを課題として勉強し始めました。いわゆるファイルのブレークポイント転送は、私の理解は、転送プロセス内のファイルは、何らかの理由で、プログラムは転送を終了するファイルを実行して停止し、再転送する次の時間は、ファイルがまだ最初から再起動する必要なしに、最後の転送場所から転送することができますです。
ファイル転送のプロセスは送り手と受け手に分かれていて、最終的に私の考え方は次のようになります。
- 送信者は、転送開始前に受信者に確認メッセージを送信し、送信するファイルのファイル名を受信者に送信します
- 確認メッセージを受信した受信機は、送信機からファイル名を受信し、送信機に対してファイル名を受信した旨の確認メッセージを送信した後、".temp" File オブジェクトと ".temp " RandomAccessFile オブジェクトを生成します。この File オブジェクトに対応するファイルの長さ(サイズ)を取得し(この長さは受信機 が受け付けた長さであり、未受信の場合は 0 となります)、送信機へ送信します。
- 送信側は、受信側が送信したファイルの長さを受信した後、送信可能なファイルの長さの合計を受信側に送信し、受信側に確認メッセージを送信します。そして、受信機から送られてきたファイルの長さに基づき、その長さに対応する位置から送信を開始する。
- 受信側は確認後、送信側から送られたデータを受け入れ、ファイルの末尾に書き込む。受け入れ完了後、".temp"ファイルは通常のファイル名に変更されます。
プロセスの図はこのようになります。
確認メッセージのための "OK"。
ブレイクポイントを有効にするためのポイントは
RandomAccessFileは、ランダムにアクセスされるファイルへの読み書きをサポートするインスタンスです。
<スパン
プログレスバーやファイルセレクタなどのGUIを追加し、最終的なメインコードは以下のようになります。
送信者スレッド
<スパン
import java.awt.Color;
import java.awt;
import java.awt;
import java.awt.FlowLayout;
import java.awt.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
public class SendFileThread extends Thread{
private Socket socket=null;
private DataOutputStream dos;
private DataInputStream dis;
private RandomAccessFile rad;
private Container contentPanel;
private JFrame frame;
private JProgressBar progressbar;
private JLabel label;
public SendFileThread(){
frame=new JFrame("file transfer");
try {
socket=new Socket("localhost", 8080);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run(){
JFileChooser fc = new JFileChooser();
int status=fc.showOpenDialog(null);
if (status==JFileChooser.APPROVE_OPTION) {
String path=fc.getSelectedFile().getPath();
try {
dos=new DataOutputStream(socket.getOutputStream());
dis=new DataInputStream(socket.getInputStream());
dos.writeUTF("ok");
rad=new RandomAccessFile(path, "r");
File file=new File(path);
byte[] buf=new byte[1024];
dos.writeUTF(file.getName());
dos.flush();
String rsp=dis.readUTF();
if (rsp.equals("ok")) {
long size=dis.readLong();//read the size of the file has been sent
dos.writeLong(rad.length());
dos.writeUTF("ok");
dos.flush();
long offset=size;//byte offset
int barSize=(int) (rad.length()/1024);
int barOffset=(int)(offset/1024);
//transfer interface
frame.setSize(380,120);
contentPanel = frame.getContentPane();
contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
progressbar = new JProgressBar();//progressbar
label = new JLabel(file.getName()+" sending in");
contentPanel.add(label);
progressbar.setOrientation(JProgressBar.HORIZONTAL);
progressbar.setMinimum(0);
progressbar.setMaximum(barSize);
progressbar.setValue(barOffset);
progressbar.setStringPainted(true);
progressbar.setPreferredSize(new Dimension(150, 20));
progressbar.setBorderPainted(true);
progressbar.setBackground(Color.pink);
JButton cancel=new JButton("cancel");
JPanel barPanel=new JPanel();
barPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
barPanel.add(progressbar);
barPanel.add(cancel);
contentPanel.add(barPanel);
cancel.addActionListener(new cancelActionListener());
frame.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
// start transferring from the specified location in the file
int length;
if (offset<rad.length()) {
rad.seek(offset);
while((length=rad.read(buf))>0){
dos.write(buf,0,length);
progressbar.setValue(++barOffset);
dos.flush();
}
}
label.setText(file.getName()+" Sending complete");
}
dis.close();
dos.close();
rad.close();
} catch (IOException e) {
// TODO Auto-generated catch block
label.setText(" Cancel sending, connection closed");
}finally {
frame.dispose();
}
}
}
class cancelActionListener implements ActionListener{
public void actionPerformed(ActionEvent e3){
try {
label.setText(" Cancel sending, connection closed");
JOptionPane.showMessageDialog(frame, "Cancel send, connection closed! ", "Prompt: ", JOptionPane.INFORMATION_MESSAGE);
dis.close();
dos.close();
rad.close();
frame.dispose();
socket.close();
} catch (IOException e1) {
}
}
}
}
レシーバーのスレッド
import java.awt.Color;
import java.awt;
import java.awt;
import java.awt.FlowLayout;
import java.awt.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.ServerSocket;
import java.net;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPanel; import javax.swing.JProgressBar;
public class ReceiveFileThread extends Thread{
private ServerSocket connectSocket=null;
private Socket socket=null;
private JFrame frame;
private Container contentPanel;
private JProgressBar progressbar;
private DataInputStream dis;
private DataOutputStream dos;
private RandomAccessFile rad;
private JLabel label;
public ReceiveFileThread(){
frame=new JFrame("ReceiveFile");
try {
connectSocket=new ServerSocket(8080);
socket=connectSocket.accept();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run(){
try {
dis=new DataInputStream(socket.getInputStream());
dos=new DataOutputStream(socket.getOutputStream());
dis.readUTF();
int permit=JOptionPane.showConfirmDialog(frame, "Whether to receive files","File transfer request: ", JOptionPane.YES_NO_OPTION);
if (permit==JOptionPane.YES_OPTION) {
String filename=dis.readUTF();
dos.writeUTF("ok");
dos.flush();
File file=new File(filename+".temp");
rad=new RandomAccessFile(filename+".temp", "rw");
//get file size
long size=0;
if(file.exists()&&file.isFile()){
size=file.length();
}
dos.writeLong(size);// send the received size
dos.flush();
long allSize=dis.readLong();
String rsp=dis.readUTF();
int barSize=(int)(allSize/1024);
int barOffset=(int)(size/1024);
//transfer interface
frame.setSize(300,120);
contentPanel =frame.getContentPane();
contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
progressbar = new JProgressBar();//progressbar
label = new JLabel(filename+" receiving");
contentPanel.add(label);
progressbar.setOrientation(JProgressBar.HORIZONTAL);
progressbar.setMinimum(0);
progressbar.setMaximum(barSize);
progressbar.setValue(barOffset);
progressbar.setStringPainted(true);
progressbar.setPreferredSize(new Dimension(150, 20));
progressbar.setBorderPainted(true);
progressbar.setBackground(Color.pink);
JButton cancel=new JButton("cancel");
JPanel barPanel=new JPanel();
barPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
barPanel.add(progressbar);
barPanel.add(cancel);
contentPanel.add(barPanel);
cancel.addActionListener(new cancelActionListener());
frame.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
//Receive the file
if (rsp.equals("ok")) {
rad.seek(size);
int length;
byte[] buf=new byte[1024];
while((length=dis.read(buf, 0, buf.length))! =-1){
rad.write(buf,0,length);
progressbar.setValue(++barOffset);
}
System.out.println("end");
}
label.setText(filename+" end receiving");
dis.close();
dos.close();
rad.close();
frame.dispose();
// file renaming
if (barOffset>=barSize) {
file.renameTo(new File(filename));
}
}else{
dis.close();
dos.close();
frame.dispose();
}
} catch (IOException e) {
// TODO Auto-generated catch block
label.setText(" Canceled reception, connection closed! ");
}finally {
frame.dispose();
}
}
class cancelActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
try {
dis.close();
dos.close();
rad.close();
JOptionPane.showMessageDialog(frame, "Canceled reception, connection closed! ", "Tip: ", JOptionPane.INFORMATION_MESSAGE);
label.setText(" Cancellation of reception, connection closed");
} catch (IOException e1) {
}
}
}
}
public class FileReceiveTest{//Receiver
public static void main(String[] args) {
// TODO Auto-generated method stub
ReceiveFileThread rf=new ReceiveFileThread();
rf.start();
}
}
public class FileSendTest{//Sender
public static void main(String[] args) {
// TODO Auto-generated method stub
SendFileThread sf=new SendFileThread();
sf.start();
}
}
public class FileSendTest{//Sender
public static void main(String[] args) {
// TODO Auto-generated method stub
SendFileThread sf=new SendFileThread();
sf.start();
}
}
関連
-
java.util.NoSuchElementException 原因解析と解決方法
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
Dateが型に解決できない問題を解決する
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
javaでクラスを作成すると、enclosing classでないように見える
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
java 例外。Javaツールの初期化
-
JSPで「リストが型解決できない!」の解決方法
-
Google Chromeのエラー「Not allowed to load local resource」の解決策について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java Error スレッド "AWT-EventQueue-0" で例外発生 java.lang.
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
このラインで複数のマーカーを解決する方法
-
Java言語プログラミング(基礎編)(第10版)練習問題解答編 第7章