HttpURLConnection,getResponseCode,网络超时 相关总结。

昨天做一个连接网络超时的功能。上网查了一下很多都是在Activity中实现一个线程来记录时间。时间到了把连网那个线程给关了并提醒超时。不过小弟不才、看别人的代码实在有点看不懂。然后找到的解决方法是在HttpURLConnection这个连网的类中实现网络超时的功能,顺便理解了下关于HttpURLConnect这个类的相关知识。

首先上代码吧。这是我实现网络通信的一个帮助类HttpAssist。

public class HttpAssist {public static String doPost(JSONObject json) {System.out.println(json.toString());try {URL postUrl = new URL(Config.url);HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connection.setConnectTimeout(10000); //设置连接超时为10sconnection.setReadTimeout(10000);//读取数据超时也是10sconnection.setRequestMethod("POST");connection.setUseCaches(false);connection.connect();//注意在connection()之前一定先做好connection属性的设置。OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());out.write(Config.getParameterName + "=" + json.toString());out.flush();out.close();BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));String line = "";String res = "";while ((line = reader.readLine()) != null) {res += line;System.out.println(line);}reader.close();connection.disconnect();return res;} catch (Exception e) {e.printStackTrace();return "error";}}}通过这个类我们可以实现网络连接超时的提醒。原理就是使用抛异常的机制。我们前面设置的connection.setConnectTimeout(10000);和connection.setConnectionTimeout(10000);这个超时设置,刚开始我还不会用,以为设置了这俩超时属性的话如果有超时就会返回一个东西来告诉我们是网络超时了。结果是他什么都不返回直接抛异常。并且就不再连接了,自然后面的代码也就不会执行了。既然这样我们可以利用捕获异常来返回东西。

如果是超时报的异常应该是MalformedURLException这个异常。还有openConnection的时候会报IOException的异常。因为这段代码不多。我们写的细心点一般不会出错,所以我直接把所有代码放在了try{}语句里面。只catch一个Excepion。(懒人就是这么懒- -!)这样只要有异常捕获我就返回一个"error"字符串。这样界面就可以获得网络错误的结果。我们就可以做其他操作。

以上是实现网络超时的方法。然后通过查询对HttpURLConnection这个类也做了点了解。因为查的时候有人说用connection.getResponseCode()这个方法来进行判断,根据Code的不同来实现不同的返回操作。首先,我感觉他说的很有道理,应该可以实现我要的效果。其次这玩意啥时候判断啊?也就是这句话用在哪。因为做web开发都是通过浏览器传值对这个也不了解。我接着查。结果查了半天也查不到在哪里使用这个语句。既然查不到就在程序中打印出来试试吧。于是就在程序中随处打印。。。。

得到的结果是这句话要在你给网络传值之后才有用。后来我一琢磨对啊。这是发送通信之后的返回状态值,我当然得先向后台发送数据之后才能执行这句啊。真他妈脑残。。。

具体来说就是在我的代码中的

out.flush();

这句之后使用getResponseCode()这方法才不报异常。如果是在之前就使用的话会直接报异常或者是报错,,并且后面的语句是不执行的。

看到这里不知道大家有没有疑问。因为我想起看过一些关于HttpURLConnection的一些文章。都有这样一个结论:

无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。

姑且不说这句话的对错。那么为什么在out.flush()之后就可以使用getResponseCode()的方法。并且放回值为200也就是通信成功。这点有点不解。还请大家指教。

暂时就这样吧 那么我们一般用返回值进行判断的话还是把getResponseCode()这句话写在getInputStream()之后吧。以防万一。

不过这样还是起不到连接超时的效果。因为如果超时的话是不会后面这些代码段的。所以以后写超时的功能的话就按上面的方法来吧。然后再附上一些其他地方看到的关于HttpURLConnection的总结:

a:) HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。b:) 在用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重,对connection对象的一切配置(那一堆set函数)都必须要在connect()函数执行之前完成。而对outputStream的写操作,又必须要在inputStream的读操作之前。这些顺序实际上是由http请求的格式决定的。如果inputStream读操作在outputStream的写操作之前,会抛出例外:java.net.ProtocolException: Cannot write output after reading input…….c:) http请求实际上由两部分组成,一个是http头,所有关于此次http请求的配置都在http头里面定义,一个是正文content。connect()函数会根据HttpURLConnection对象的配置值生成http头部信息,因此在调用connect函数之前,就必须把所有的配置准备好。d:) 在http头后面紧跟着的是http请求的正文,正文的内容是通过outputStream流写入的,实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络,而是存在于内存缓冲区中,待outputStream流关闭时,根据输入的内容生成http正文。至此,http请求的东西已经全部准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求正式发送到服务器了,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http请求在getInputStream的时候已经发送出去了(包括http头和正文),因此在getInputStream()函数之后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生。

版权声明:本文为博主原创文章,未经博主允许不得转载。

是不是因为心痛的麻木了,我才笑得最美丽。

HttpURLConnection,getResponseCode,网络超时 相关总结。

相关文章:

你感兴趣的文章:

标签云: