【问题标题】:Which of the two APIs, openConnection() or connect(), actually opens a connection?openConnection() 或 connect() 这两个 API 中的哪一个实际上打开了连接?
【发布时间】:2016-03-09 11:01:52
【问题描述】:

我对 Android 比较陌生。我对 Android 中用于网络通信的 2 个 API 的功能有一个非常基本的困惑。

  1. openConnection()
  2. 连接()

conn.connect() 看来,connect() 是实际创建连接的原因。

url.openConnection() 看来,openConnection() 实际上创建了连接。

从围绕 SO 主题的一些讨论中, conn.connect() 支持前者,4 票赞成 url.openConnection() 支持后者,得到了 97 票赞成。

有人可以帮忙解惑吗?

【问题讨论】:

  • tbray.org/ongoing/When/201x/2012/01/17/HttpURLConnection 令人惊讶的是 4 票。 Url 方法实际上只创建一个连接对象,用于进行连接。
  • @zapl 感谢您的指点。您提供的链接信息丰富。但是,那里也有一些令人困惑的地方。它在一个地方提到 conn.getOutputStream();执行网络 i/o 并在另一个中说“// 与前面示例中的相同调用不同,这 // 不会引发网络 IO。in = conn.getInputStream();”此外,它没有提及任何关于连接()。也非常感谢您提供一些帮助。
  • 当还没有连接时,这些方法会自动调用 connect()。您不必自己调用它。 Wrt 不清楚:措辞有点糟糕,意思是getInputstream 导致没有请求等,因为http服务器在他们自己收到请求后立即发送响应。阅读回复已经从getResponseCode开始。
  • 好的。这就说得通了。谢谢。我还想了解一件事。我正在开发一个 Xposed(Android 框架)模块,其中我想将应用程序进行的所有 https 网络调用连接到后端服务器。我的方法应该是什么?挂钩 connect() (因为现在我明白 connect() 无论如何都会被这些方法中的任何一个调用)?
  • 我想这样就可以了。试试吧。 (很多软件也自带了自己的http客户端实现(ok http很流行)所以你不会看到所有的https调用)

标签: java android network-programming httpurlconnection


【解决方案1】:

因此,进一步深入研究实际上帮助我更清楚地理解了这一点。

正如上面的 cmets 中所讨论的那样,正如 here 中所说的那样

  1. 连接对象是通过调用 openConnection 创建的 URL 上的方法。
  2. 设置参数和一般请求属性被操纵。
  3. 实际连接到远程对象,使用 连接方式。
  4. 远程对象变为可用。标头字段和 可以访问远程对象的内容。

现在就 conn.getInputStream() 而言,根据this

您并不总是需要显式调用 connect 方法来启动连接。依赖连接的操作,如 getInputStream、getOutputStream 等,将在必要时隐式执行连接。

现在他们究竟是如何隐式建立联系的,我仍在试图弄清楚!

【讨论】:

  • Err,如果还没有被调用,他们会调用connect()。没有什么神秘的。
  • @EJP 任何支持文档将不胜感激。我正在编写一个 Xposed 模块来捕获所有 HTTPS 请求。当前方法 - 挂钩 openConnection(),在对象上调用 connect()。要求 - 挂钩实际连接本身。所以挂钩 connect() 本身。问题 - 有时使用 getInputStream() 代替 connect(),并且我不能在 Xposed 中同时挂钩两个方法。因此,我想确定在 getInputStream() 的情况下也调用了 connect() 本身。有了这个确认,我就可以单独连接 connect() 而无需真正操心其他任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
相关资源
最近更新 更多