Networking 用java监控自己的网络流量

Networking 用java监控自己的网络流量,networking,jakarta-mail,Networking,Jakarta Mail,我有一个Java程序,可以连接到internet并发送文件(带有附件的电子邮件、SSL、javamail)。 它一次只发送一封电子邮件 我的程序有没有办法跟踪它自己产生的网络流量? 这样我就可以跟踪发送电子邮件的进度 如果是跨平台解决方案也很好…另一个用户的方法是: 在较低的级别上,如果希望监视发送的字节数,则应该能够编写自己的SocketFactory,生成生成包装的InputStreams和OutputStreams的套接字,以监视通过它们的数据量。这是一点工作,可能比你真正想要的级别低,

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

我的程序有没有办法跟踪它自己产生的网络流量? 这样我就可以跟踪发送电子邮件的进度


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

另一个用户的方法是:


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

我一直想自己做这件事,但我仍在等待那一轮

不管怎样,这里有更多的细节。一旦你进入其中,可能会有我不知道的陷阱


您需要创建自己的SocketFactory类。JavaMail SSLNOTES.txt文件中有一个简单的示例,它将委托给另一个工厂来完成这项工作。您需要使用“new MySocket(factory.createSocket(…)”,而不是factory.createSocket(…)”,其中MySocket是您编写的一个类,它覆盖所有方法,以委托给构造函数中传递的套接字。除了getInputStream和getOutputStream方法之外,它们必须使用类似的方法用您自己创建的流类包装返回的流。然后,这些流类必须重写所有读写方法,以跟踪传输的数据量,并使这些信息在希望监视进度的代码中以任何方式可用。在执行要监视的操作之前,请重置计数。然后,随着操作的进行,计数将被更新。它不会给你一个“完成百分比”指标,因为你不知道需要发送多少低级数据才能完成操作。

这里有另一种方法,它只适用于发送消息

要发送的消息的数据由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将消息写入一个流,该流只计算正在写入的数据量,同时丢弃数据。然后你就知道消息的实际大小,所以当消息被发送时,你可以知道消息的百分比是多少


希望对您有所帮助……

是否没有应用程序级方法或类可以检测数据何时发送并返回相关信息?也许是外部图书馆?因为第一种方法对我来说是不允许的,因为电子邮件的大小不同,第二种方法是基本上编写我自己的javamail(在某种程度上)…不,没有现成的方法可以做到这一点。我承认第二种方法很重要,但它远不是编写自己的JavaMail。老实说,我不知道Java和网络的第一件事,但我真的很想完成这件事。对你来说,把你的问题扩大一点,并解释一下到底如何做低层次的方法会是一个问题吗?更多我可以抓住和探索的API和教程了。。。伪代码,如果你愿意。。。我现在只有一个消息对象,我真的不知道该怎么处理。。。哦,这不会让事情变慢,是吗?至少不会太多?嗯,我发送电子邮件只是为了能够将文件传输到服务器,然后GMail过滤器将根据主题、邮件标题等管理他们收到的电子邮件。。。因此,99%的信息将是附件的大小,我知道。这就是最后一段的内容,除此之外,先生,您刚刚让我大开眼界