1

インターネットに接続してファイル(添付ファイル付きの電子メール、SSL、javamail)を送信するJavaプログラムがあります。一度に1通のメールのみを送信します。

プログラム自体が生成しているネットワークトラフィックを追跡する方法はありますか?そうすれば、送信されているメールの進行状況を追跡できます...

それがクロスプラットフォームソリューションだったら、それもいいでしょう...

4

3 に答える 3

1

別のユーザーのアプローチは次のとおりです 。JavaメールでのJProgressBarの使用(transport.send()後の進行状況を知る)

下位レベルでは、送信されているバイト数を監視する場合は、ラップされたInputStreamsを生成するSocketsとそれらを通過するデータの量を監視するOutputStreamsを生成する独自のSocketFactoryを作成できる必要があります。これは少し手間がかかり、おそらく実際に必要なレベルよりも低いレベルですが、別のアプローチです。

于 2012-09-13T18:11:44.257 に答える
1

私はしばらくの間、これを自分でやろうと思っていましたが、まだそのラウンドの授業を待っています... :-)

とにかく、ここでもう少し詳しく説明します。入ってみるとわからない落とし穴があるかもしれません...

独自の SocketFactory クラスを作成する必要があります。JavaMail SSLNOTES.txt ファイルには、別のファクトリに委任して作業を行う簡単な例があります。factory.createSocket(...) の代わりに、「new MySocket(factory.createSocket(...))」を使用する必要があります。ここで、MySocket は、渡された Socket にデリゲートするすべてのメソッドをオーバーライドする作成するクラスです。コンストラクター。getInputStream および getOutputStream メソッドを除いて、同様のアプローチを使用して、返されたストリームを自分で作成したストリーム クラスでラップする必要があります。これらのストリーム クラスは、すべての読み取りメソッドと書き込みメソッドをオーバーライドして、転送されるデータの量を追跡し、進行状況を監視したいコードでその情報を利用できるようにする必要があります。監視したい操作を行う前に、カウントをリセットします。その後、操作が進行するにつれて、カウントが更新されます。何それ操作を完了するために送信する必要がある低レベルのデータの量がわからないため、「完了率」の測定値は得られません

于 2012-09-14T03:10:51.567 に答える
1

メッセージの送信にのみ機能する別のアプローチを次に示します...

送信されるメッセージのデータは、Message.writeTo メソッドによって生成され、ソケットから直接送信されるさまざまなストリームを通じてフィルター処理されます。MimeMessage をサブクラス化し、writeTo メソッドをオーバーライドし、そこを流れるデータをカウントする独自の OutputStream で OutputStream をラップし (私の他の提案と同様)、それをプログラムに報告することができます。コードで...

public class MyMessage extends MimeMessage {
    ...
    public void writeTo(OutputStream os, String[] ignoreList) throws IOException, MessagingException {
        super.writeTo(new MyCountingStream(os), ignoreList);
    }
}

完了率が必要な場合は、最初に Message.writeTo を使用して、データを破棄しながら、書き込まれるデータの量をカウントするだけのストリームにメッセージを書き込むことができます。次に、メッセージが実際にどれだけ大きいかがわかるので、メッセージが送信されているときに、それがメッセージの何パーセントであるかがわかります。

それが役立つことを願っています...

于 2012-09-14T03:19:14.817 に答える