【问题标题】:How to get the socket used by HttpURLConnection in java如何在java中获取HttpURLConnection使用的套接字
【发布时间】:2012-12-07 04:50:46
【问题描述】:

HttpURLConnection 内部使用一个套接字来发送数据。 我知道它现在可以从外面看到,但我想知道是否有任何解决方法可以访问这个套接字(不改变 HttpURLConnection 的实现)? 我需要这个 hack 来做一些检测。

非常感谢。

【问题讨论】:

  • 你真正想做什么?也就是说,如果你真的可以得到套接字,你会尝试什么“hack to do some instrumentation”。我有一些想法,但在回复之前我需要了解更多信息。
  • @selbie 我需要调用 setsockopt 或 ioctl 在该套接字(tos 字段等)上设置一些自定义标志。最终,我需要稍后在交换机中识别通过此套接字发送的数据包。谢谢。

标签: java sockets httpconnection


【解决方案1】:

套接字由Socket Factories 创建。您可以编写自己的 SocketFactory,委托给原始套接字工厂。在您的 Socket Factory 中,您可以操作套接字。这是我能想到的让你访问套接字的一种方法,但我会提前警告你——它不会很漂亮。

【讨论】:

  • 如果我编写自己的套接字工厂,我的应用程序的所有网络相关活动都会使用该工厂,还是可以只指定一个(或两个)连接来使用该工厂?
  • 另外,如果我可以在运行时更改套接字的标志是最好的——而不仅仅是在创建它们时。这可能吗?
  • 套接字工厂是 JVM 范围的(更准确地说,是类加载器范围的)。所有套接字请求都将通过您的套接字工厂。但是,如果您将套接字工厂设计为包装器,则可以将所有“不感兴趣的”套接字创建委托给 default 套接字工厂,并且只处理您真正感兴趣的那些。
  • 他如何注册他的 SocketFactory 实现?这样后续的套接字使用会通过他的工厂吗?
  • 我会尝试使用反射来获取httpconnection的运行时类实例,然后使用jni来访问它的protected/private字段。我会让你们知道结果。
猜你喜欢
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多