1

我有一个 Java 程序,它连接到 Internet 并发送文件(带有附件的电子邮件、SSL、javamail)。它一次只发送一封电子邮件。

有没有办法让我的程序跟踪它本身产生的网络流量?这样我就可以跟踪正在发送的电子邮件的进度......

如果它是跨平台解决方案也很好......

4

3 回答 3

1

另一个用户的方法在这里: Using JProgressBar with Java Mail(在 transport.send() 之后知道进度)

在较低级别上,如果您想监视发送的字节数,您应该能够编写自己的 SocketFactory 来生成 Sockets,这些 Sockets 生成包装的 InputStreams 和 OutputStreams 来监视通过它们的数据量。这有点工作,可能比你真正想要的要低,但这是另一种方法。

于 2012-09-13T18:11:44.257 回答
1

一段时间以来,我一直想自己做这件事,但我仍在等待那轮学费...... :-)

无论如何,这里只是更详细一点。一旦你进入它,可能会有我不知道的陷阱......

您需要创建自己的 SocketFactory 类。JavaMail SSLNOTES.txt 文件中有一个简单的示例,它委托给另一个工厂来完成工作。您需要使用“new MySocket(factory.createSocket(...))”而不是 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 回答