我有一个Java程序,它连接到互联网并发送文件(带附件的电子邮件,SSL,javamail)。 它一次只发送一封电子邮件。
我的程序有没有办法跟踪它自己生成的网络流量? 这样我就可以跟踪发送电子邮件的进度......
如果它是跨平台的解决方案也会很好......
答案 0 :(得分:1)
另一位用户的方法是: Using JProgressBar with Java Mail ( knowing the progress after transport.send() )
在较低级别,如果要监视正在发送的字节数,您应该能够编写自己的SocketFactory来生成包含InputStreams和OutputStreams的Sockets,以监视通过它们的数据量。这是一些工作,也许比你真正想要的更低,但这是另一种方法。
答案 1 :(得分:1)
我一直想自己这样做一段时间,但我还在等待那一轮...: - )
无论如何,这里只是更详细一点。一旦你进入它可能会有一些我不知道的问题......
您需要创建自己的SocketFactory类。 JavaMail SSLNOTES.txt文件中有一个简单的例子,它委托给另一个工厂来完成工作。而不是factory.createSocket(...),你需要使用“new MySocket(factory.createSocket(...))”,其中MySocket是你编写的一个类,它覆盖了委托给传入的Socket的所有方法构造函数。除了getInputStream和getOutputStream方法之外,它们必须使用类似的方法将流返回的流包装为您自己创建的流类。然后,这些流类必须覆盖所有读取和写入方法,以跟踪传输的数据量,并使这些信息可用,但是您希望监视进度的代码。在执行要监视的操作之前,请重置计数。然后随着操作的进行,计数将被更新。 不会给您的是“完成百分比”度量,因为您不知道需要多少低级数据才能完成操作。
答案 2 :(得分:1)
这是另一种仅适用于发送消息的方法......
要发送的消息的数据由Message.writeTo方法生成,并通过将其直接发送到套接字的各种流进行过滤。您可以继承MimeMessage,覆盖writeTo方法,使用您自己的OutputStream包装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将消息写入一个流,该流除了计算正在写入的数据量之外什么都不做,同时丢弃数据。然后你知道消息的真实程度,所以当发送消息时,你可以知道消息的百分比。
希望有帮助...