当前位置: 首页 > 知识库问答 >
问题:

你能解释一下HttpURLConnection连接过程吗?

邵飞白
2023-03-14

我正在使用HTTPURLConnection连接到web服务。我知道如何使用HTTPURLConnection,但我想了解它是如何工作的。基本上,我想知道以下几点:

  • HTTPURLConnection在哪一点尝试建立到给定URL的连接

共有3个答案

上官兴昌
2023-03-14

HTTPURLConnection在哪一点尝试建立到给定URL的连接?

在URL中指定的端口上(如果有),否则HTTP为80,HTTPS为443。我相信这是有记录的。

在哪一点上我可以知道我成功地建立了联系?

调用getInputStream()getOutputStream()getResponseCode()时,不会出现异常。

是否在一个步骤/方法调用中建立连接并发送实际请求?这是什么方法?

没有也没有。

你能用外行人的术语解释getOutputStream()getInputStream()的功能吗?

如果需要,它们中的任何一个都会首先连接,然后返回所需的流。

我注意到当我试图连接到的服务器关闭时,我在getOutputStream()处得到一个异常。这是否意味着只有当我调用getOutputStream()时,HTTPURLConnection才会开始建立连接?getInputStream()怎么样?既然我只能在getInputStream()处获得响应,那么这是否意味着我还没有在getOutputStream()处发送任何请求,而是简单地建立连接?当我调用getInputStream()时,HttpURLConnection是否返回服务器请求响应?

见上文。

我说的openConnection()只是创建了一个新的连接对象,但还没有建立任何连接,对吗?

如何测量读取开销和连接开销?

连接:花费getInputStream()getOutputStream()返回所需的时间,以您先调用的为准。阅读:从开始第一次读取到获取EOS的时间。

何嘉运
2023-03-14

Tim Bray给出了一个简明的分步说明,openConnection()不会建立实际的连接,而是在调用getInputStream()或getOutputStream()等方法之前不会建立实际的HTTP连接。

http://www.tbray.org/ongoing/When/201x/2012/01/17/HttpURLConnection

苏法
2023-03-14
String message = URLEncoder.encode("my message", "UTF-8");

try {
    // instantiate the URL object with the target URL of the resource to
    // request
    URL url = new URL("http://www.example.com/comment");

    // instantiate the HttpURLConnection with the URL object - A new
    // connection is opened every time by calling the openConnection
    // method of the protocol handler for this URL.
    // 1. This is the point where the connection is opened.
    HttpURLConnection connection = (HttpURLConnection) url
            .openConnection();
    // set connection output to true
    connection.setDoOutput(true);
    // instead of a GET, we're going to send using method="POST"
    connection.setRequestMethod("POST");

    // instantiate OutputStreamWriter using the output stream, returned
    // from getOutputStream, that writes to this connection.
    // 2. This is the point where you'll know if the connection was
    // successfully established. If an I/O error occurs while creating
    // the output stream, you'll see an IOException.
    OutputStreamWriter writer = new OutputStreamWriter(
            connection.getOutputStream());

    // write data to the connection. This is data that you are sending
    // to the server
    // 3. No. Sending the data is conducted here. We established the
    // connection with getOutputStream
    writer.write("message=" + message);

    // Closes this output stream and releases any system resources
    // associated with this stream. At this point, we've sent all the
    // data. Only the outputStream is closed at this point, not the
    // actual connection
    writer.close();
    // if there is a response code AND that response code is 200 OK, do
    // stuff in the first if block
    if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
        // OK

        // otherwise, if any other status code is returned, or no status
        // code is returned, do stuff in the else block
    } else {
        // Server returned HTTP error code.
    }
} catch (MalformedURLException e) {
    // ...
} catch (IOException e) {
    // ...
}

在上面的示例HTTP帖子中,每个方法旁边的前3个问题答案都以内联注释的形式列出。

从getOutputStream:

返回写入此连接的输出流。

基本上,我认为你对这是如何工作的有很好的理解,所以让我用外行的术语重申一下。 <罢工> 连接 流,目的是将数据写入服务器。在上面的代码示例中,“消息”可能是我们发送到服务器的注释,表示在帖子上留下的注释。当您看到getOutputStream时,您正在打开 <罢工> 连接 写流,但你实际上不写任何数据,直到你调用writer.write(消息=消息);

从getInputStream():

返回从该打开连接读取的输入流。如果读取超时在数据可供读取之前过期,则从返回的输入流读取时可能会引发SocketTimeoutException。

getInputStream的作用正好相反。与getOutputStream类似,它也会打开一个

getInputStream怎么样?既然我只能在getInputStream上获得响应,那么这是否意味着我还没有在getOutputStream上发送任何请求,只是建立了一个连接?

请记住,发送请求和发送数据是两种不同的操作。当你调用 getOutputStream或getInputStream url。openConnection(),向服务器发送请求以建立连接。当服务器向您发回连接已建立的确认时,就会发生握手。这时,你就准备好发送或接收数据了。因此,您不需要调用getOutputStream来 建立联系 打开一个流,除非您提出请求的目的是发送数据。

用外行的话说,发出getInputStream请求相当于打电话到你朋友家说“嘿,我可以过来借那副虎钳吗?”而你的朋友在握手时会说:“当然!来拿吧。”。然后,在这一点上,建立了连接,你走到你朋友的家,敲门,请求虎钳,然后走回你的家。

getOutputStream使用类似的例子需要打电话给你的朋友,说“嘿,我有欠你的钱,我能寄给你吗”?你的朋友需要钱,而你在里面病得很厉害,所以你把钱藏了这么久,他说:“当然,来吧,你这个卑鄙的混蛋。”。所以你走到你朋友家,把钱“邮寄”给他。然后他把你踢出去,你走回自己的家。

现在,继续用外行人的例子,让我们看看一些例外。如果你打电话给你的朋友,他不在家,那可能是500个错误。如果你打电话给朋友,收到一条断开的号码信息,因为你的朋友厌倦了你总是借钱,那就找不到404页面。如果你的手机因为你没有付账而没电,那可能是一个IOExctive。(注意:这一部分可能不是100%正确。它旨在让你大体了解外行人所说的情况。)

问题#5:

<罢工> 是的,你是正确的,openConnection只是创建了一个新的连接对象,但没有建立它。当您调用getInputStream或getOutputStream时,连接就建立了。

openConnection创建一个新的连接对象。从URL。openConnection javadocs:

每次通过调用该URL的协议处理程序的openConnection方法打开一个新连接。

在调用openConnection时建立连接,在实例化InputStream、OutputStream或两者时调用它们。

问题#6:

为了测量开销,我通常会在整个连接块周围包装一些非常简单的计时代码,如下所示:

long start = System.currentTimeMillis();
log.info("Time so far = " + new Long(System.currentTimeMillis() - start) );

// run the above example code here
log.info("Total time to send/receive data = " + new Long(System.currentTimeMillis() - start) );

我相信有更高级的方法来测量请求时间和开销,但这通常足以满足我的需求。

有关关闭连接的信息,您没有询问,请参阅Java中的URL连接何时关闭?。

 类似资料:
  • 本文向大家介绍简单描述一下,TCP的连接和释放过程。相关面试题,主要包含被问及简单描述一下,TCP的连接和释放过程。时的应答技巧和注意事项,需要的朋友参考一下 考察点:网络基础   三次握手的过程 1)主机A向主机B发送TCP连接请求数据包,其中包含主机A的初始序列号seq(A)=x。(其中报文中同步标志位SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的

  • 本文向大家介绍请你解释一下什么是线程池(thread pool)?相关面试题,主要包含被问及请你解释一下什么是线程池(thread pool)?时的应答技巧和注意事项,需要的朋友参考一下 考察点:线程池 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效

  • 我是Hibernate和JPA的新手,我对这个注释有问题。有人能简单地解释一下这个注释到底在做什么吗?因为在这种情况下,文档对我来说很难理解。 编辑我明白什么是持久上下文,但在代码中,我有这样的例子: 我对@PerustenceContext做什么有问题。抱歉,也许我没有具体说明。

  • 本文向大家介绍请你解释一下,什么是Web Service?相关面试题,主要包含被问及请你解释一下,什么是Web Service?时的应答技巧和注意事项,需要的朋友参考一下 考察点:web service   从表面上看,Web Service就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法透明的调用这个应用程序,不需要了解它的任何细节,跟你使用的编程

  • 我对javascript还是个新手,只知道基本知识。有人能解释一下下面的代码,就像在调用init函数时发生的流中一样吗? 我对下面代码的理解是,一旦调用init函数,就会设置一个全局变量输出,该输出映射到一个带有id输出的HTML元素。然后调用。这将创建一个WebSocket对象。这之后是我不完全理解的部分。 在行中,WebSocket对象有一个名为open的属性,我们将它设置为任何返回的属性 。