【问题标题】:Monitor own network traffic in java在java中监控自己的网络流量
【发布时间】:2012-09-14 11:19:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: networking jakarta-mail


    【解决方案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 将消息写入流,该流只计算正在写入的数据量,同时丢弃数据。然后你就知道消息到底有多大,所以当消息被发送时,你可以知道消息的百分比。

    希望对您有所帮助...

    【讨论】:

    • 好吧,我发送电子邮件只是为了能够将文件传输到服务器,然后 GMail 过滤器将根据主题、邮件标题等管理他们收到的电子邮件......所以 99%邮件的附件将是我知道其大小的附件。这样就可以处理最后一段了,除此之外,先生,我刚刚度过了愉快的时光! =)
    【解决方案2】:

    另一个用户的方法在这里: Using JProgressBar with Java Mail ( knowing the progress after transport.send() )

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

    【讨论】:

    • 是否没有应用程序级别的方法或类可以以某种方式检测何时发送数据并返回有关它的信息?也许是一个外部图书馆?因为第一种方法对我来说是禁忌,因为电子邮件的大小各不相同,而第二种方法基本上是写我自己的 javamail(在一定程度上)......
    • 不,没有现有的东西可以做到这一点。我承认第二种方法并不简单,但它远非编写自己的 JavaMail。
    • 老实说,我对 Java 和网络一无所知,但我真的很想完成这项工作。稍微扩展您的问题并解释如何准确地执行低级方法对您来说会是一个问题吗?更多的东西我可以抓住并从中探索 API 和教程......伪代码,如果你愿意......我现在只有一个消息对象,我真的不知道该怎么做......哦,这不会减慢速度,是吗?至少不会太多?
    【解决方案3】:

    我一直想自己做这件事有一段时间了,但我还在等那轮学费……:-)

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多