次に、前の記事がアップロードされてダウンロードされます。
5。ブレークポイントの再開
QQに精通しているプログラマの場合、QQのブレークポイント連続伝送機能は非常に印象的です。それは非常に実用的で側面だからです。したがって、アップロードおよびダウンロードプロセス中に、ブレークポイントの連続伝送の機能は非常によく実装されています。
実際、ブレークポイントの連続伝送の原理は非常に簡単です。アップロードプロセス中に、サービスにアクセスして、このファイルが存在するかどうかを確認します。いくつかのファイルが存在する場合は、サーバー上のファイルのサイズをローカルファイルのサイズと比較します。サーバー上のファイルがローカルのファイルよりも小さい場合、このファイルのアップロードプロセス中にブレークポイントの連続伝送が可能であると考えられています。
実装中、RandomAccessFileクラスが役立ちます。このクラスのインスタンスサポートランダムアクセスファイルへの読み取りと書き込み。ランダムアクセスファイルは、ファイルシステムに保存されている大きなバイト配列のように動作します。ファイルポインターと呼ばれる暗黙の配列を指すカーソルまたはインデックスがあります。入力操作は、ファイルポインターからバイトを読み取り、バイトが読み取られるとファイルポインターを前方に移動します。ランダムアクセスファイルが読み取り/書き込みモードで作成されている場合、出力操作も利用できます。出力操作はファイルポインターから始まり、バイトが書かれているときにファイルポインターを進めます。暗黙のアレイの現在の端に書き込みた後の出力操作により、配列が拡張されます。ファイルポインターは、getFilePointerメソッドを介して読み取り、SEEKメソッドを介して設定できます。
randomAccessFileクラスのSkipBytesメソッドは、スキップされたバイトをスキップしてスキップしたバイトを破棄しようとします。サーバーからアップロードするファイルのサイズnを見つけた場合、Skipbytesメソッドを使用してこれらのNバイトをスキップし、新しい場所からのブレークポイント連続伝送を開始できます。特定の方法については、JDK5のAPI説明を参照してください。
DataConnectionクラスの実行方法で、割り込み点の連続伝送のアップロードとダウンロードの実装を確認できます。コードは次のとおりです。
public void run(){try {newline = con.getcrlf(); if(settings.getftppasvmode()){try {sock = new Socket(host、port); sock.setsotimeout(settings.getSockettimeout()); } catch(Exception ex){ok = false;デバッグ( "ポートでソケットを開くことはできません" +ポート); }} else {//log.debug("trying new Server Socket: "+port); try {ssock = new Serversocket(port); } catch(Exception ex){ok = false; log.debug( "ポートでServersocketを開くことはできません" +ポート); }}} catch(Exception ex){debug(ex.toString()); } isthere = true; boolean ok = true; randomAccessfile fout = null; BufferedOutputStream Bout = null; randomAccessfile fin = null; try {if(!settings.getftppasvmode()){int retry = 0; while((retry ++ <5)&&(sock == null)){try {ssock.setsotimeout(settings.connectiontimeout); sock = ssock.accept(); } catch(ioexception e){sock = null; Debug( "ソケットを開こうとしている間にIOExceptionを取得しました!"); if(retry == 5){debug( "接続が失敗し、5回試してみる - settings.javaでより高いタイムアウトを試してみてください"); }完成= true; eを投げる; }最後に{ssock.close(); } debug( "タイムアウト、再試行"); }} if(ok){byte [] buf = new byte [settings.bufferize]; start = system.currenttimemillis(); int buflen = 0; // --------------ダウンロード、下载------------------------ if(type.equals(get)|| type.equals(getDir)){if(!justStream){try {if(resume){file f = new file(file); fout = new RandomAccessFile(file、 "rw"); fout.skipbytes((int)f.length()); buflen =(int)f.length(); } else {if(localfile == null){localfile = file; } file f2 = new file(settings.apphomedir); f2.mkdirs();ファイルf = newファイル(localfile); if(f.exists()){f.delete(); } bout = new BufferedOutputStream(new FileOutputStream(localFile)、settings.BufferSize); }} catch(Exception ex){debug( "outputfileを作成できません:" + file); ok = false; ex.printstacktrace(); }} // ---------------アップロード、上传---------------------- if(type.equals(put)|| type.equals(putdir)){if(in == null){try {fin = new randomaccessfile(file、 "r"); if(resume){fin.skipbytes(skiplen); } // fin = new BufferedInputStream(new FileInputStream(file)); } catch(Exception ex){debug( "inputfileを開くことはできません:" + "(" + ex + ")"); ok = false; }} if(ok){try {out = new BufferedOutputStream(sock.getOutputStream()); } catch(Exception ex){ok = false; debug( "outputStreamを取得できません"); } if(ok){try {int len = skiplen; Char B; while(true){int read; if(in!= null){read = in.read(buf); } else {read = fin.read(buf); } len += read; //system.out.println(file + "" + type + "" + len + "" + read); if(read == -1){break; } if(newline!= null){byte [] buf2 = modifyput(buf、read); out.write(buf2、0、buf2.length); } else {out.write(buf、0、read); } con.fireprogressupdate(file、type、len); if(time()){// log.debugsize(len、false、false、file); } if(read == streamtokenizer.tt_eof){break; }} out.flush(); //log.debugsize(len、false、true、file); } catch(ioException ex){ok = false; debug( "エラー:データ接続が閉じています。"); con.fireprogressupdate(file、failed、-1); ex.printstacktrace(); }}}}}}} catch(ioexception ex){log.debug( "ソケットをServersocketに接続できない"); ex.printstacktrace(); }最後に{try {if(out!= null){out.flush(); out.close(); }} catch(Exception ex){ex.printstacktrace(); } try {if(bout!= null){bout.flush(); bout.close(); }} catch(Exception ex){ex.printstacktrace(); } try {if(fout!= null){fout.close(); }} catch(Exception ex){ex.printstacktrace(); } try {if(in!= null &&!justStream){in.close(); } if(fin!= null){fin.close(); }} catch(Exception ex){ex.printstacktrace(); }} try {sock.close(); } catch(Exception ex){debug(ex.toString()); } if(!settings.getftppasvmode()){try {ssock.close(); } catch(Exception ex){debug(ex.toString()); }} finish = true; if(ok){con.fireprogressupdate(file、finent、-1); } else {con.fireprogressupdate(file、failed、-1); }} 6。FTPポートマッピング
FTPデータ接続には、PASVとポートの2種類があります。 FTPサーバーがイントラネットにある場合は、ポートマッピングを使用する必要があります。当初、FTPの外部ネットワークマッピングについてあまり知りませんでしたので、多くの迂回路を取り始めました。最初は、プログラムに何か問題があるといつも思っていて、多くの時間を無駄にしました。この期間を通して、誰もが開発中に不必要な時間とエネルギーをより少ないか、またはまったく費やさないことを願っています。
イントラネットに直接アクセスする方法を導入したPCDに関する記事がありました。実際、ポートマッピングツールを使用している限り、イントラネットに浸透する目的を簡単に実現できます。 「ポートマッパー」はそのようなツールです。言及する価値があるのは、コマンドラインモードを取り除き、グラフィカルインターフェイスの動作環境を提供することです。
あなたにもっと理解させるために、最初に原則について話させてください。ホストAのLANがあると仮定します。ホストに加えて、LANにはBを備えたマシンもあります。もちろん、BマシンはホストAを介してインターネットをサーフィンしています。インターネットにアクセスできるマシンもあります。これは、AおよびBと同じLANにアクセスできません。通常、マシンCはホストAにのみアクセスできますが、LANにアクセスできません。作品。指定されたポートのデータをLAN内の別のマシンの指定されたポートに転送し、それによりイントラネットマシンにアクセスする目的を達成します。このように言って、誰もが理解しています。それを構成する方法に関しては、著者はそれが難しい仕事ではないべきではないと考えています。その上、インターネットにはそのようなグラフィックの説明がたくさんあります。セットアップについては、インターネット上の記事を参照してください。
もちろん、イントラネットへの直接アクセスを実現することの利点は明らかです。他に何も言うまでもなく、少なくともFTPリソースは完全に利用されています。ただし、イントラネットへの直接アクセスがイントラネットのセキュリティを脅かす可能性があることを思い出さなければなりません。著者は、ほとんどの友人がまだホストセキュリティの重要性を重要視していると考えていますが、多くの場合、イントラネットマシンのセキュリティ設定を無視しています。イントラネットへの直接アクセスを達成したら、イントラネットマシンをホストのように扱う必要があります。そうしないと、ネットワーク全体が危険にさらされる可能性があります。
クライアントリソースにアクセスします
Javaアプリケーション環境のセキュリティポリシー。これは、さまざまなコードが所有するさまざまなリソースの許可に関するポリシーオブジェクトによって表現されています。アプレット(またはSecurityManagerの下で実行されているアプリケーション)がファイルの読み取りや書き込みなどの保護された動作を実行するには、アプレット(またはJavaアプリケーション)がその操作の許可を取得する必要があり、セキュリティポリシーファイルを使用してこれらの許可を実装します。
ポリシーオブジェクトには複数のエンティティがある場合がありますが、いつでも動作できるのは1つだけです。現在インストールされているポリシーオブジェクトは、GetPolicyメソッドを呼び出すことでプログラムで取得するか、SetPolicyメソッドを呼び出すことで変更できます。ポリシーオブジェクトはポリシー全体を評価し、どのコードがどのリソースにアクセスできるかを詳細にする適切な権限オブジェクトを返します。ポリシーファイルは、フォーマットされていないASCIIファイル、またはポリシークラスのバイナリファイルまたはデータベースに保存できます。この記事では、フォーマットされていないASCIIファイルの形式についてのみ説明します。
実際に使用すると、特にデジタル署名を使用しない場合は、このような複雑なJava.Policyファイルを手動で記述する必要はありません。現時点では、既製のC:/プログラムファイル/Java/JRE1.5.0_12/lib/security/java.policyファイルからJREが提供することから完全に学ぶことができ、ニーズに応じて対応する変更を行うことができます。この記事では、デジタル署名が使用されていない状況のセキュリティポリシーファイルを記述します。以下は、Windows NT/XPで使用される完全なJava.Policyファイルです。ファイルでは、各「許可」レコードの目的がコメントを使用して個別に説明されます。もちろん、さまざまなプログラムには、リソースアクセス権の要件が異なる場合があり、プロジェクトのニーズに応じて調整および選択できます。
grant {//システムとユーザーディレクトリの許可を「読み取り」する許可java.util.propertypermission "user.dir"、 "read";許可java.util.propertypermission "user.home"、 "read";許可java.util.propertypermission "java.home"、 "read";許可java.util.propertypermission "java.home"、 "read";許可java.util.propertypermission "java.class.pat"、 "read";許可java.util.propertypermission "user.name"、 "read"; //スレッドおよびスレッドグループの操作許可許可java.lang.runtimepermission "AccessclassinPackage.sun.misc";許可java.lang.runtimepermission "AccessclassinPackage.sun.audio";許可java.lang.runtimepermission "ModifyThread";許可java.lang.runtimepermission "ModifyThreadGroup";許可java.lang.runtimepermission "loadLibrary。*"; //ファイルを読み書きする許可許可java.io.filepermission "<< all files >>"、 "read";許可java.io.filepermission "$ {user.dir} $ {/} jmf.log"、 "write";許可java.io.filepermission "$ {user.home} $ {/}。Jmstudiocfg"、 "write";許可java.net.socketpermission "*"、 "connect、accept";許可java.io.filepermission "c:/winnt/temp/*"、 "write";許可java.io.filepermission "c:/winnt/temp/*"、 "delete";許可java.awt.awtpermission "showwindowwithoutwarningbanner";許可javax.sound.sampled.audiopermission "record"; // //ソケットポートを操作するためのさまざまな権限許可java.net.socketpermission " - "、 "risten";許可Java.net.SocketPermission " - "、 "Accept";許可java.net.socketpermission " - "、 "connect";許可java.net.socketpermission " - "、 "Resolve";許可java.security.allpermission; }; Grant SignedBy "Saili" {許可java.net.socketpermission "*:1024-65535"、 "Connect、Accept、Resolve";許可java.net.socketpermission "*:80"、 "connect";許可java.net.socketpermission " - "、 "耳を傾け、受け入れ、接続し、聞く、解決する"、署名した「ganja」;許可Java.net.SocketPermission " - "、 "Accept";許可java.net.socketpermission " - "、 "connect";許可java.net.socketpermission " - "、 "Resolve";許可java.security.allpermission; };このプロジェクトでは、クライアントユーザー設定をより便利で簡単に使用できるようにするために、上記のファイルはVBまたはC#を使用して小さなプログラムになります。次に、JREといくつかのEXEをEXEパッケージに組み合わせます。 JREがインストールされた後、このアプレットは、オペレーティングシステムにJREのインストールパスを見つけ、プログラム内のjava.policyファイルを書き留めて元のファイルを上書きします。このようにして、ユーザーはEXEファイルをインストールするだけで、インストール操作の数を簡素化する必要があります。
7。アプレットコールバックサーバー
JavaScriptとアプレットが互いに通信する能力は、私たちに多くの利便性をもたらします。 JavaとJavaScriptはお互いを補完して、より完璧なWebアプリケーションを開発します。 B/sは、Javaの利点を最大限に活用して、より多くのネットワークエクスペリエンスをもたらし、ユーザーにとって便利になります。著者は、スイングコンポーネントによって開発されたより多くのアプリケーションを使用して、アプレットを使用してB/Sアーキテクチャを実装しています。これにより、スイングコンポーネントの利点を完全に実証し、システムのアップグレードを促進し、維持できます。さらに、Webでは、クライアントがローカルハードウェアリソースを使用する必要がある場合があります。私が知っていることは、それがアプレットを通じて実装され、アプレットを介してJava APIを呼び出すということです。 JavaScriptとアプレットがどのように詳細に通信するかを見てみましょう。
1.JavaScriptアプレットへのアクセス
<アプレット名= "AppletName" .... /// JavaScriptはアプレットプロパティにアクセスします。
window.document.appletname.appletfield(プロパティは公開する必要があります。 "window.document。"は書くことなく書くこともできます)// javascriptアプレットメソッドへのアクセス。
window.document.appletname.appletmethod(メソッドはpublicでなければなりません "window.document。"は書くことなく書くこともできます)。
2.JavaScriptへのアプリケートアクセス
Live Connectは、JavaとJavaScriptの間のインターフェイスを提供します。これにより、JavaScriptをJavaアプレットアプレットで使用できます。
JARパッケージを使用して、C:/プログラムファイル/Java/ディレクトリでそれを探す必要があります。約5mです。実際、それを開くだけで、どのnetscape.javascript.jsobjectがあるかを確認するだけです。 Netscapeがインストールされていない場合、またはオンラインまたはオフラインで行うことができます。 Netscape.jar(必要ではない)に名前を変更でき、開発中にコンパイルする目的でClassPathに追加する必要があります。 netscape.jarは展開中に含まれる必要はないことに特に重要です。パッケージ全体がクライアントにダウンロードされ、速度に影響するため、Jarは展開中に含まれる必要はありません。
// netscapeクラスを紹介しますnetscape.javascript.jsobject; netscape.javascript.jsexceptionをインポートします。 //アプレットの例外イベントを処理することができますpublic void calljavascript(string callbackjavascript){jsobject window = jsobject.getwindow(this); // javaScriptウィンドウのハンドルを取得し、現在のドキュメントウィンドウjsobject document =(jsobject)window.getmember( "document")を参照してください。 form =(jsobject)doc.getMember( "textform"); // JavaScriptフォームオブジェクトTextField =(jSobject)form.getMember( "textfield")にアクセスします。 JavaScript Text Object Text =(string)textfield.getMember( "value")にアクセスします。 //テキスト領域の値を取得する// javascriptのalert()method()method // window.eval( "alert(/"このアラートはJava!/")"から来ます); window.call(callbackjavascript、null); //パラメーターは配列の形で表されます。 }8。操作効果
1。アップロード
(1)。アップロードを起動します
(2)。アップロード
(3)。アップロード
(4)。正常にアップロードします
2。ダウンロード
(1)ダウンロードファイルのパスを保存します
(2)ダウンロード
(3)ダウンロード
(4)正常にダウンロードします
9。概要
この記事では、著者は実際のプロジェクトのアップロードおよびダウンロードの問題のソリューションを説明し、FTPプロトコルを使用して、バッチ、基本的なWeb大型ファイルのアップロードおよびダウンロードを実現します。同時に、アプレットテクノロジーを介してクライアントのローカルリソースにアクセスできます。 Progress Bar、Breakpointの連続伝送、FTP内部および外部ネットワークマッピングなど、人々がしばしば遭遇する実際の機能のいくつかについて予備的な議論が行われました。これは、FTP Javaクライアントライブラリに基づいた著者の基本的なアプリケーションです。読者のためのリファレンスになることを願っています。これらの未完成の問題のいくつかを補完してください。また、比較的簡単で、ここにリストされていないオンラインで説明や例があるコンテンツもいくつかあります。たとえば、FTPがサーバー側のServ-UソフトウェアでFTPサービスを確立する方法、JSPページとパラメーター配信方法にアプレットが埋め込まれる方法、およびスペースの制限により、EclipseまたはNetBeansでアプレットを開始する方法は、詳細な説明はありません。インターネット上の例またはその他の参照資料を参照してください。
住所をダウンロード:http://xiazai.vevb.com/201608/yuanma/ftptransfer(vevb.com).rar
注:著作権の問題を考慮すると、Javaクラスファイルは送信されませんでしたが、誰もがそのようなJARファイルをJavaファイルに復元する方法にすでに精通していると思います。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。