昨天做一个连接网络超时的功能。上网查了一下很多都是在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,网络超时 相关总结。相关推荐

  1. java url 设置超时_(转)HttpURLConnection中设置网络超时

    Java中可以使用HttpURLConnection来请求WEB资源. HttpURLConnection对象不能直接构造,需要通过URL.openConnection()来获得HttpURLConn ...

  2. HttpURLConnection中设置网络超时

    (转 转:http://www.xd-tech.com.cn/blog/article.asp?id=37 Java中可以使用HttpURLConnection来请求WEB资源. HttpURLCon ...

  3. 安卓访问网络超时闪退? 安卓如何访问网络?求解

    使用HttpURLConnection发送请求获取返回数据,网络连接请求超时会发生闪退. 可能的原因有两种 返回的网络连接为空,后续通过该连接调用获取返回码或者获取返回数据等方法时会发生空指针错误造成 ...

  4. android 网络编程实现,Android开发使用HttpURLConnection进行网络编程详解【附源码下载】...

    本文实例讲述了Android开发使用HttpURLConnection进行网络编程.分享给大家供大家参考,具体如下: --HttpURLConnection URLConnection已经可以非常方便 ...

  5. Android使用HttpURLConnection访问网络

    Android使用HttpURLConnection访问网络 一.管理网络状态 使用网络进行数据通信前,需要先获取网络状态. 使用ConnectivityManager获取网络状态步骤: 1.获取Co ...

  6. 使用HttpURLConnection进行网络访问及代码实战

    使用HttpURLConnection进行网络访问 HttpURLConnection是一种多用途.轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序.继承至URLConnec ...

  7. Oracle 各类连接超时相关参数学习

    最近遇到些空闲连接超时相关的问题,查了下主要有以下与超时相关参数,整理记录含义及区别. EXPIRE_TIME IDLE_TIMEOUT SESSION_TIMEOUT INBOUND_CONNECT ...

  8. 简单的几种网络超时检测

     [1]网络超时检测的定义      在网络通信中,很多操作会使得进程阻塞 TCP套接字中的recv/accept UDP套接字中的recvfrom 超时检测的必要性           避免进程 ...

  9. android网络编程及网络超时处理

    android网络编程及网络超时处理 本文是收录的两篇关于这方面的文章 Android超时机制的处理 由于手机端应用的响应,与当时的无线通信网络状况有很大的关联.而通信网络往往具有不稳定,延迟长的特点 ...

最新文章

  1. nginx日志通过rsyslog传入到日志服务器指定目录
  2. [ 一起学React系列 -- 11 ] React-Router4 (1)
  3. Android之实现上下左右翻页效果
  4. SQL语句之Insert
  5. Taro+react开发(28)本地用require线上不必
  6. 通达oa wbupload.php,关于通达OA上传附件类型限制的设置
  7. 【C语言】在有序数组中插入一个数,保证它依然有序
  8. 设置JDK环境变量(linux版)
  9. oracle双引号拼接,oracle 单引号拼凑和动态sql | 学步园
  10. 分模块的maven项目调试时报Source not found的解决办法
  11. 跟我一起学Windows Workflow Foundation(4)-----使用Listen,Delay,和其他envnt-based定制活动...
  12. 行军导航过程中导向箭头
  13. 在blog中放置北京奥运倒计时Flash
  14. 【渝粤题库】陕西师范大学201041德育论 作业(专升本)
  15. J2ME BUG 收集
  16. camera内存优化
  17. 关于vue3 的vue-router.mjs:3434 ReferenceError: parcelRequire is not defined
  18. excel里面身份证号显示不全
  19. win7计算机文件浏览不了,win7系统计算机文件打不开的解决方法
  20. excel表格怎么调整行高和列宽_Excel 表格技巧—一键调整行高列宽的方法

热门文章

  1. python画老虎_Python数据结构:列表
  2. 儿时回忆—— 淘气的童年
  3. RabbitMQ教程(四) Java 使用rabbitmq
  4. 下代Macbook会用什么处理器?
  5. 金融贷款行业获客新渠道:贷款行业电销资源如何获取,一手精准客户资源在哪找
  6. 微信记录丢失还能恢复吗丨苹果手机
  7. atm机java设计_JAVA提款机设计报告
  8. PICT的介绍与使用
  9. jQuery表单序列化方法serialize(),serializeArray()
  10. 老ipad搜索不到蓝牙,用手机做热点就可以了