【发布时间】:2012-09-14 11:19:14
【问题描述】:
我有一个 Java 程序,它连接到 Internet 并发送文件(带附件的电子邮件、SSL、javamail)。 它一次只发送一封电子邮件。
我的程序有没有办法跟踪它本身产生的网络流量? 这样我就可以跟踪正在发送的电子邮件的进度...
如果是跨平台解决方案也很好......
【问题讨论】:
我有一个 Java 程序,它连接到 Internet 并发送文件(带附件的电子邮件、SSL、javamail)。 它一次只发送一封电子邮件。
我的程序有没有办法跟踪它本身产生的网络流量? 这样我就可以跟踪正在发送的电子邮件的进度...
如果是跨平台解决方案也很好......
【问题讨论】:
这是另一种仅适用于发送消息的方法...
要发送的消息的数据由 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 将消息写入流,该流只计算正在写入的数据量,同时丢弃数据。然后你就知道消息到底有多大,所以当消息被发送时,你可以知道消息的百分比。
希望对您有所帮助...
【讨论】:
另一个用户的方法在这里: Using JProgressBar with Java Mail ( knowing the progress after transport.send() )
在较低级别上,如果您想监控正在发送的字节数,您应该能够编写自己的 SocketFactory 来生成 Socket,这些 Socket 生成包装的 InputStreams 和 OutputStreams 来监控通过它们的数据量。这有点工作,而且可能比你真正想要的要低,但这是另一种方法。
【讨论】:
我一直想自己做这件事有一段时间了,但我还在等那轮学费……:-)
无论如何,这里只是更详细一点。一旦你进入它,可能会有我不知道的陷阱......
您需要创建自己的 SocketFactory 类。 JavaMail SSLNOTES.txt 文件中有一个简单的示例,它委托给另一个工厂来完成这项工作。您需要使用“new MySocket(factory.createSocket(...))”而不是 factory.createSocket(...),其中 MySocket 是您编写的一个类,它覆盖所有方法以委托给传入的 Socket构造函数。除了 getInputStream 和 getOutputStream 方法,它们必须使用类似的方法来使用您自己创建的流类包装返回的流。然后,这些流类必须覆盖所有读取和写入方法,以跟踪传输的数据量,并根据您想要监控进度的代码提供该信息。在您执行要监控的操作之前,请重置计数。然后随着操作的进行,计数将被更新。它不会为您提供“完成百分比”度量,因为您不知道需要发送多少低级数据才能完成操作。
【讨论】: