http连接之HttpURLConnection

来源:互联网 发布:linux file命令 源码 编辑:程序博客网 时间:2024/05/07 11:40
1. 创建HttpURLConnection对象
2. 设置选项参数
3. 获取输出流(如果没有单独调用conn.connect(), 则获取输出流时会调用)
4. 输出流的获取写入必须在输入流之前
5. 设置参数必须在connect之前,否则无效
6. 在我的测试环境下,这里的connecttimeout并没有生效,从connect()方法看,timeout后会拋出异常,如果没有设
   置timeout, 则connect一直到连接上为止。
7. 这里的conn.getOutputStream()会进行connect,耗时长达20多秒。开始排查问题。
问题排查:
1. 选项参数是否有漏设置的
2. 通过抓包分析。linux下 tcpdump -w google.cap  ; 在windows下通过wireshark分析google.cap
3. 因为是http连接,所以在wireshark分析是,我只筛选了hhtp包进行分析,发现请求包与回复包用时0.05秒
4. 实际上只筛选http是不对的,因为问题出在了连接上,http包是在连接之后的事情了
5. 修改筛选条件为:ip.addr == 122.114.58.130 and tcp.port == 45428
6. 这样就看到了一次完整的http建立连接的三次握手,连接建立后的http包的发送与回复,关闭连接。
7.从连接到发送包的回复,用时0.12秒,而关闭连接耗时10秒作用
8. 关闭并不会影响到连接的时间。所以连接的耗时并不久。这样估计耗时在域名解析上了。
9. 在/etc/hosts文件中添加域名后,连接一切就OK了,不再出现客户端多次点击进入游戏才进入的情况了。
10.虽然长时间才能连接上,但是仍然会返回校验成功,只是服务器有个超时判定,超时后,则不会返回校验成功的数
   据,也就登陆不了了。
11./etc/hosts配置IP与域名的关系,类似windows下的hosts文件。/etc/host.conf配置域名解析的顺序。/etc/resol
v.conf配置绑定的域名服务,也就是要在哪些域名服务器中查找需要的域名。  /etc//h、、osts 文件
12. nslookup 域名:解析域名
final URL url = new URL( urlstring);
final HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");conn.setDoInput(true);conn.setDoOutput(true);conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");conn.setConnectTimeout(config.connecttimeout);conn.setReadTimeout(config.readtimeout);conn.setUseCaches(false);OutputStream os = conn.getOutputStream();PrintWriter printWriter = new PrintWriter(os);printWriter.write(param);printWriter.flush();printWriter.close();os.close();if (conn.getResponseCode() == 200) {   int linenum = 0;   final InputStream is = conn.getInputStream();   try {      InputStreamReader in = new InputStreamReader(is, Config.UTF8);      BufferedReader buffer = new BufferedReader(in, 4096);      StringBuilder resultDataBuilder = new StringBuilder();      while (true) {         final String line = buffer.readLine();         if (null == line)            break;         resultDataBuilder.append(line);         linenum++;         if (maxlinenum > 0 && linenum >= maxlinenum)            break;      }      buffer.close();      in.close();      if (xdb.Trace.isDebugEnabled())         xdb.Trace.debug("HttpIO.getRequest resultDataBuilder = " + resultDataBuilder);      return resultDataBuilder.toString();   } finally {      is.close();   }}else {   Logger.trace("conn.conn.getResponseCode() = " + conn.getResponseCode());   return "";}
0 0
原创粉丝点击