首先上代码吧。这是我实现网络通信的一个帮助类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); //设置连接超时为10s
connection.setReadTimeout(10000); //读取数据超时也是10s
connection.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 inp