我正在使用HTTPURLConnection
连接到web服务。我知道如何使用HTTPURLConnection
,但我想了解它是如何工作的。基本上,我想知道以下几点:
HTTPURLConnection
在哪一点尝试建立到给定URL的连接
HTTPURLConnection
在哪一点尝试建立到给定URL的连接?
在URL中指定的端口上(如果有),否则HTTP为80,HTTPS为443。我相信这是有记录的。
在哪一点上我可以知道我成功地建立了联系?
调用getInputStream()
或getOutputStream()
或getResponseCode()
时,不会出现异常。
是否在一个步骤/方法调用中建立连接并发送实际请求?这是什么方法?
没有也没有。
你能用外行人的术语解释getOutputStream()
和getInputStream()
的功能吗?
如果需要,它们中的任何一个都会首先连接,然后返回所需的流。
我注意到当我试图连接到的服务器关闭时,我在getOutputStream()
处得到一个异常。这是否意味着只有当我调用getOutputStream()
时,HTTPURLConnection才会开始建立连接?getInputStream()怎么样?既然我只能在getInputStream()
处获得响应,那么这是否意味着我还没有在getOutputStream()
处发送任何请求,而是简单地建立连接?当我调用getInputStream()
时,HttpURLConnection是否返回服务器请求响应?
见上文。
我说的openConnection()
只是创建了一个新的连接对象,但还没有建立任何连接,对吗?
对
如何测量读取开销和连接开销?
连接:花费getInputStream()
或getOutputStream()
返回所需的时间,以您先调用的为准。阅读:从开始第一次读取到获取EOS的时间。
Tim Bray给出了一个简明的分步说明,openConnection()不会建立实际的连接,而是在调用getInputStream()或getOutputStream()等方法之前不会建立实际的HTTP连接。
http://www.tbray.org/ongoing/When/201x/2012/01/17/HttpURLConnection
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的属性,我们将它设置为任何返回的属性 。