Http请求重复发送

移动开发 码拜 9年前 (2015-04-25) 1882次浏览 0个评论

以下是android发送Http请求的代码,但是经常出现:服务器响应很久, android端出现ReadTimeout, android端又会再发一次同样的请求,导致数据重复。有人说是jdk1.4.2的问题,但我用的是1.6.0。请大神们帮忙
        
 

 URL url = null;
		HttpURLConnection conn = null;
		String result = "";

		try {
			String sParam = "&m=" + methodName;
			if (vector != null) {
				for (int i = 0; i < vector.size(); i++) {
					sParam += "&p" + String.valueOf(i) + "=" + vector.elementAt(i).toString();
				}
			}
			byte[] data = sParam.getBytes();

			url = new URL(realURL.replace("xx.mobile", methodName+".mobile"));

			conn = (HttpURLConnection) url.openConnection();

			conn.setConnectTimeout(CONNECT_TIMEOUT);

			conn.setReadTimeout(READ_TIMEOUT);

			conn.setDoInput(true);

			conn.setDoOutput(true);

			conn.setRequestMethod(METHOD_POST);

			conn.setRequestProperty("Connection", "Keep-Alive");

			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

			conn.setRequestProperty("Content-Length", String.valueOf(data.length));

			conn.setRequestProperty("Charset", "utf-8");

			conn.setUseCaches(false);

			OutputStream outStream = conn.getOutputStream();

			outStream.write(data);

			outStream.flush();

			outStream.close();

			if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) // ResponseCode:200
			{
				InputStream inStream = conn.getInputStream();
				//int contentLen = conn.getContentLength();
				result = readInputStream(inStream,1024);

				inStream.close();
			} else {
				result = "500"; //server error
			}
		} catch (ConnectTimeoutException e) {
			// TODO: handle exception
			CommonData.Log("ConnectTimeoutException");
			throw new MyException(HTTP_RESULT_CONNECT_TIMEOUT);
		} catch (SocketTimeoutException e) {
			// TODO: handle exception
			CommonData.Log("SocketTimeoutException");
			throw new MyException(HTTP_RESULT_READ_TIMEOUT);
		} catch (Exception e) {
			// TODO: handle exception
			CommonData.Log(e.getLocalizedMessage());
			throw new MyException(HTTP_RESULT_EXCEPTION);
		} finally {
			conn.disconnect();
		}
Http请求重复发送
我觉得不太可能重复发送请求 
除非你的代码调用有问题,或者你的请求放在了service里面,service重复执行导致的。
Http请求重复发送
引用 1 楼 birdsaction 的回复:

我觉得不太可能重复发送请求 
除非你的代码调用有问题,或者你的请求放在了service里面,service重复执行导致的。

没有放service里,用的AsyncTask。

看下下面的文章,说是jdk1.4.2的bug,但是我用的是1.6.6,谢谢
http://wenku.baidu.com/link?url=q_nrKoNNis8bTWNbcopGO0YGzmTKfZG_JVboTvSxg5dWfVaOp_W-lLlagVeNmsgSJAsZL_0dy_vKGRFlEPKUR5W2VfdLl6Sodhhtw1pRsmG

Http请求重复发送
conn.setRequestProperty(“Connection”,?”Keep-Alive”); 这个去掉看看。
Http请求重复发送
引用 3 楼 birdsaction 的回复:

conn.setRequestProperty(“Connection”,?”Keep-Alive”); 这个去掉看看。

有试过,还是 一样

Http请求重复发送
加入log 看看你这段代码是不是执行了两次
而且你还要看看你测试时android的版本
Http请求重复发送
引用 5 楼 sagittarius1988 的回复:

加入log 看看你这段代码是不是执行了两次
而且你还要看看你测试时android的版本

只有调一次,有打Log, android 4.3 sansung note3. 华为荣耀四核 android4.2都会出现这样的情况。
另外J2ME程序的nokia手机也会

Http请求重复发送
来人啊,帮忙啊
Http请求重复发送
10分
尝试用 httpclient 吧  

 看不出什么问题,属于疑难杂症吧

Http请求重复发送
引用 8 楼 davidleen29 的回复:

尝试用 httpclient 吧  

 看不出什么问题,属于疑难杂症吧

Android我已经换成HttpClient,有设置HttpRequestRetryHandler为false,就不会出现重发的现象.
但是在j2me中只有HttpConnection,找不到问题可怎么办啊

Http请求重复发送
大牛们啊,帮忙啊 
Http请求重复发送
10分
底层的实现中 如果发现http请求超时  有重发机制
Http请求重复发送
网络抓包吧 , 看有没有发送出去 
Http请求重复发送
引用 11 楼 ysh512 的回复:

底层的实现中 如果发现http请求超时  有重发机制

请问,这个有资料可查吗?如何能禁用呢?

Http请求重复发送
引用 12 楼 z2586039 的回复:

网络抓包吧 , 看有没有发送出去 

有发出去.

Http请求重复发送
引用 13 楼 Roy_se7en 的回复:
Quote: 引用 11 楼 ysh512 的回复:

底层的实现中 如果发现http请求超时  有重发机制

请问,这个有资料可查吗?如何能禁用呢?

以前在一个人的blog中看到的,现在找不到了

Http请求重复发送
引用 15 楼 ysh512 的回复:
Quote: 引用 13 楼 Roy_se7en 的回复:
Quote: 引用 11 楼 ysh512 的回复:

底层的实现中 如果发现http请求超时  有重发机制

请问,这个有资料可查吗?如何能禁用呢?

以前在一个人的blog中看到的,现在找不到了

麻烦帮忙找下,万分感谢。

Http请求重复发送
10分
引用 16 楼 Roy_se7en 的回复:
Quote: 引用 15 楼 ysh512 的回复:
Quote: 引用 13 楼 Roy_se7en 的回复:
Quote: 引用 11 楼 ysh512 的回复:

底层的实现中 如果发现http请求超时  有重发机制

请问,这个有资料可查吗?如何能禁用呢?

以前在一个人的blog中看到的,现在找不到了

麻烦帮忙找下,万分感谢。

原来那个找不到了 你看看这个 意思类似
http://blog.csdn.net/hanqunfeng/article/details/4510338

Http请求重复发送
引用 17 楼 ysh512 的回复:
Quote: 引用 16 楼 Roy_se7en 的回复:
Quote: 引用 15 楼 ysh512 的回复:
Quote: 引用 13 楼 Roy_se7en 的回复:
Quote: 引用 11 楼 ysh512 的回复:

底层的实现中 如果发现http请求超时  有重发机制

请问,这个有资料可查吗?如何能禁用呢?

以前在一个人的blog中看到的,现在找不到了

麻烦帮忙找下,万分感谢。

原来那个找不到了 你看看这个 意思类似
http://blog.csdn.net/hanqunfeng/article/details/4510338

谢谢。但是他说是jdk1.4.2的bug,可是我用的是jdk1.6.0,还是会出现这个重发的问题

Http请求重复发送
来人啊,帮忙啊
Http请求重复发送
10分
http://developer.nokia.com/community/wiki/Using_HTTP_and_HTTPS_in_Java_ME

这个你看下  

还有你的j2me 中的相关代码 也请po出来, 前面的是 android中的代码。

Http请求重复发送
引用 20 楼 davidleen29 的回复:

http://developer.nokia.com/community/wiki/Using_HTTP_and_HTTPS_in_Java_ME

这个你看下  

还有你的j2me 中的相关代码 也请po出来, 前面的是 android中的代码。

谢谢你的回复。看了上面的帖子,还是没得到有用的信息。下面我就贴出j2me的代码。

Http请求重复发送
以下是J2ME 发送http请求的代码,如果超过一定时间服务器没有响应,j2me就会重发一次相同的请求

private class RunHttpRequest implements Runnable {

        private HttpConnection conn = null;
        private OutputStream os = null;
        private InputStream is = null;
        private ByteArrayOutputStream baos = null;
        private DataOutputStream dos = null;

        private String result;
        private String url;
        private String method;
        private Vector ps;

        public RunHttpRequest(String url, String method, Vector ps) {
            this.url = url;
            this.method = method;
            this.ps = ps;
        }

        public void run() {
            
            try {

                String sParam = "&m=" + method;
                for (int i = 0; i < ps.size(); i++) {
                    sParam += "&p" + String.valueOf(i) + "=" + ps.elementAt(i).toString();
                }

                conn = (HttpConnection) Connector.open(url, Connector.READ_WRITE);
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                conn.setRequestProperty("Content-Length", Integer.toString(sParam.length()));
                conn.setRequestProperty("Charset", "utf-8");
                conn.setRequestProperty("Connection", "Keep-Alive");
                conn.setRequestProperty("Content-Language", "en-US");
                
                conn.setRequestMethod(HttpConnection.POST);

                os = conn.openDataOutputStream();
                //sParam = URLEncoder.encode(sParam,"UTF-8");
                os.write(sParam.getBytes());
                os.flush();

                int respCode = conn.getResponseCode();
                if (respCode == HttpConnection.HTTP_OK) {
                    is = conn.openDataInputStream();
                    int contentLen = (int)conn.getLength();
                    if(contentLen>0){
                        byte[] b = new byte[contentLen];
                        int len = 0;
                        baos = new ByteArrayOutputStream();
                        dos = new DataOutputStream(baos);
                        while ((len = is.read(b)) != -1) {
                            dos.write(b, 0, len);
                        }

                        byte[] bytes = baos.toByteArray();
                        result = new String(bytes, "utf-8");

                        result = StringUtil.replaceString(result, "\r\n", "\n");
                    }
                }
                else if(respCode == HttpConnection.HTTP_MOVED_TEMP){
                    //当用户从其它地方登录时,服务器URL发生转向.
                    result = HTTP_RESULT_MOVED_TEMP;
                }
                else {
                    result = HTTP_RESULT_SERVER_ERROR;
                }
            }
            catch (Exception e) {
                result = HTTP_RESULT_EXCEPTION;
                MainMidlet.perferences.setRecord_Log(CommonData.KEY_LOGINFO,("Exception-"+e.getMessage()).getBytes());
            }
            finally {
                close();
            }
        }

        /**
         * @return the result
         */
        public String getResult() {
            return result;
        }

        public void close() {
            try {
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
                if (os!=null){
                    os.close();
                    os = null;
                }
                if (is != null) {
                    is.close();
                    is = null;
                }            
                if (baos != null) {
                    baos.close();
                    baos = null;
                }
                if (dos != null) {
                    dos.close();
                    dos = null;
                }
            }
            catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
Http请求重复发送
1 关闭的顺序 不知道有没有关系  应该是先输入输出流  然后才是connect。
2 你看下能否查看源代码,然后找到这个重发的相关设置的位置,利用java反射机制关掉它。
Http请求重复发送
引用 23 楼 davidleen29 的回复:

1 关闭的顺序 不知道有没有关系  应该是先输入输出流  然后才是connect。
2 你看下能否查看源代码,然后找到这个重发的相关设置的位置,利用java反射机制关掉它。

1.顺序应该没有关系吧,我试试看。
2.就是找不到重复发送的相关代码,所以才没有任何办法了

Http请求重复发送
50分
1:
http://bugs.java.com/view_bug.do?bug_id=6672144

这里面描述的 bug 和你说的很像。

它的解决方案是设置系统属性。
From JDK6 you can set the system property, sun.net.http.retryPost, to false to prevent the HTTP client from silently resending the POST request. 
  java -Dsun.net.http.retryPost=false …

2:
http://developer.nokia.com/community/discussion/showthread.php/233689-HTTP-Connection-sending-request-twice-after-30-sec

这个完全是你说的案例。它的建议是后台参与进来 

Http请求重复发送
引用 18 楼 Roy_se7en 的回复:
Quote: 引用 17 楼 ysh512 的回复:
Quote: 引用 16 楼 Roy_se7en 的回复:
Quote: 引用 15 楼 ysh512 的回复:
Quote: 引用 13 楼 Roy_se7en 的回复:
Quote: 引用 11 楼 ysh512 的回复:

底层的实现中 如果发现http请求超时  有重发机制

请问,这个有资料可查吗?如何能禁用呢?

以前在一个人的blog中看到的,现在找不到了

麻烦帮忙找下,万分感谢。

原来那个找不到了 你看看这个 意思类似
http://blog.csdn.net/hanqunfeng/article/details/4510338

谢谢。但是他说是jdk1.4.2的bug,可是我用的是jdk1.6.0,还是会出现这个重发的问题

你应该试下jdk 1.7  如果1.7没有这个现象 那就是jdk1.6也存在这个bug  如果jdk1.7不存在这个问题  那就是你自己代码问题

Http请求重复发送
引用 25 楼 davidleen29 的回复:

1:
http://bugs.java.com/view_bug.do?bug_id=6672144

这里面描述的 bug 和你说的很像。

它的解决方案是设置系统属性。
From JDK6 you can set the system property, sun.net.http.retryPost, to false to prevent the HTTP client from silently resending the POST request. 
  java -Dsun.net.http.retryPost=false …

2:
http://developer.nokia.com/community/discussion/showthread.php/233689-HTTP-Connection-sending-request-twice-after-30-sec

这个完全是你说的案例。它的建议是后台参与进来 

非常感谢你的回复。对于这个问题,在前端还是没有什么办法解决吗? 还是只能通过后台来过滤….

Http请求重复发送
顶顶顶,还有没有别的办法啊
Http请求重复发送
顶顶顶,求大神啊
Http请求重复发送
连接超时和读取超时时间会不会不一致?
Http请求重复发送
引用 31 楼 foolsheep 的回复:

连接超时和读取超时时间会不会不一致?

这2者不一致有关系吗?

Http请求重复发送
10分
引用 32 楼 Roy_se7en 的回复:
Quote: 引用 31 楼 foolsheep 的回复:

连接超时和读取超时时间会不会不一致?

这2者不一致有关系吗?

如果连接还没有超时,而读取时间超时的话,HttpUrlConnection就会再重新发送请求。所以,要解决这个重发问题,可以试一下,把读取超时的时间设置得比连接超时稍长一点,因为有时候,jdk计算的时间会有点偏差,这样可以保证在连接超时之前不会读取超时

Http请求重复发送
楼主,我也碰到这个问题了。请问这个问题解决了吗
Http请求重复发送
楼主,我也碰到这个问题了。请问这个问题解决了吗???
Http请求重复发送
引用 34 楼 ht99582 的回复:

楼主,我也碰到这个问题了。请问这个问题解决了吗

你的是什么问题

Http请求重复发送
引用 35 楼 zhoupeiyuan 的回复:

楼主,我也碰到这个问题了。请问这个问题解决了吗???

你什么问题

Http请求重复发送
引用 37 楼 Roy_se7en 的回复:
Quote: 引用 35 楼 zhoupeiyuan 的回复:

楼主,我也碰到这个问题了。请问这个问题解决了吗???

你什么问题

我这边用HttpUrlConnection上传文件,在服务器超时后,客户端已经捕获到SocketTimeOut,并在界面显示发送失败,但底层的协议又会去重发请求,而且重发又成功了,导致客户端显示的是失败,而服务器已经收到数据了。

Http请求重复发送
底层如果动不了,考虑应用层解决,后台这边通过接收时长来判断是否重复发送的请求进行过滤操作。
Http请求重复发送
我也遇到这个问题了,网上搜到的

http://blog.sina.com.cn/s/blog_8d76e0ed0101l1eh.html

但是不知道是不是好用。

Http请求重复发送
加长超时时间,我是这样解决的

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Http请求重复发送
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!