HTTP请求自动重发

ustbsjl 2008-01-27 10:17:27
我有一个接受http请求的服务端,后来写了一个简单的客户端,客户端代码如下:
package com.umpay.preboss.test;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.umpay.preboss.httpServer.Socklet2HTTP;

public class HttpPostTest {
private static Log _log = LogFactory.getLog(Socklet2HTTP.class);

public static void main(String args[]) throws Exception {

DataInputStream dis = new DataInputStream(new FileInputStream(
"bin\\test.xml"));
StringBuffer sb = new StringBuffer();

String temp = null;
temp = dis.readLine();
while (temp != null) {
sb.append(temp);
temp = dis.readLine();
}
String url ="http://localhost:9000/dobusiness";

StringBuffer sbody = new StringBuffer();
sbody.append("$xmldata=").append(sb.toString());
_log.debug("发送报文[" + sbody + "]");
byte[] httpReq = sbody.toString().getBytes();
_log.info("length = " + httpReq.length);
URL httpurl = new URL(url);
HttpURLConnection httpConn = (HttpURLConnection) httpurl
.openConnection();
//httpConn.setConnectTimeout(10000);
httpConn.setRequestMethod("POST");
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
httpConn.setUseCaches(false);

//httpConn.set
String httpRes = "";
try {
_log.debug("urlc.send()...");
// 发送请求
OutputStream os = httpConn.getOutputStream();
os.write(httpReq); // 发送body数据
os.flush();
os.close();
_log.debug("urlc.recv()...");
// 判断响应
int rcode = httpConn.getResponseCode();
if (rcode != HttpURLConnection.HTTP_OK) {
throw new Exception("rcode!=HttpURLConnection.HTTP_OK");
}
// 接受报文体信息
InputStream in = httpConn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
StringBuffer sb1 = new StringBuffer();
String s = "";
while ((s = br.readLine()) != null) {
sb1.append(s + "\r\n");
}
in.close();
System.out.println(sb1.toString());
} catch (Exception e) {
_log.error(e);
} finally {
httpConn.disconnect();
}

}
}

如果我的服务端没有很快的响应这个请求的话,服务端马上会收到客户端的第二次请求,客户端自动重发了一次,请教各位大虾是否碰到过这种情况,如何解决?
...全文
767 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
老紫竹 2008-01-27
  • 打赏
  • 举报
回复
如果我的服务端没有很快的响应这个请求的话,服务端马上会收到客户端的第二次请求

问题1:
为什么没有很快响应?
问题2:
你在服务器端看到了第二次请求了?

我并不认为,URLConnection 会自动重试,我的是 1.5 和 1.6 版本

http://blog.yesky.com/Blog/yangsy/archive/2005/04/01/99445.html

你用的难道是 1.4? 难道是一个BUG

你的setSoTimeout 还是打开吧!免得有问题!!
老紫竹 2008-01-27
  • 打赏
  • 举报
回复
是的! 这个是地址前面的那个小图标的
比如CSDN 的那个大大的 C
google 的那个 G
ustbsjl 2008-01-27
  • 打赏
  • 举报
回复
这个我弄好了,用IE发送的请求我只收到一个,但是现在又有一个新的问题,是不是用浏览器请求的话每次都会有一个Get请求,请求网站的LOGO,每次都会有GET /favicon.ico HTTP/1.1
然后我的服务端就会
java.io.FileNotFoundException: \favicon.ico (系统找不到指定的路径。)
老紫竹 2008-01-27
  • 打赏
  • 举报
回复
你做一个表单不会吗?

test.htm

<form method="POST" action="http://localhost:9000/dobusiness">
<input type="submit"/>
// 其他参数你自己加吧!我不清楚了
</form>
ustbsjl 2008-01-27
  • 打赏
  • 举报
回复
不会弄啊,用IE访问服务器端能不能设置是POST请求啊
老紫竹 2008-01-27
  • 打赏
  • 举报
回复
这样不是需要一个表单吗?

那就做一个表单阿!很麻烦吗?
ustbsjl 2008-01-27
  • 打赏
  • 举报
回复
你用IE访问你的服务器端看看,是不是也出现2次请求 我用浏览器访问的话怎么发报文体,我需要用POST方法,这样不是需要一个表单吗?
你的 _log.debug("urlc.send()..."); 难道打印了2次?? 不是的,只有一次
老紫竹 2008-01-27
  • 打赏
  • 举报
回复
1 你用IE访问你的服务器端看看,是不是也出现2次请求
2 客户端代码是很普通的,没有发现什么问题,
你的 _log.debug("urlc.send()...");
难道打印了2次??
老紫竹 2008-01-27
  • 打赏
  • 举报
回复
我怎么没看到2次请求呢??
[Socklet2HTTP:doPOST]收到报文

DEBUG HttpRecvQ - [FUNCODE]T3101002

明显是你的日志程序的输出了2次,并不是你的程序调用了2次!
ustbsjl 2008-01-27
  • 打赏
  • 举报
回复
===== SockletHttp.doHttp() =====
- POST /dobusiness HTTP/1.1
- Cache-Control: no-cache
- Pragma: no-cache
- User-Agent: Java/1.5.0_11
- Host: localhost:9000
- Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
- Connection: keep-alive
- Content-type: application/x-www-form-urlencoded
- Content-Length: 209
-
0127.170648.890 4390 [MTTask#1 ] DEBUG Socklet2HTTP - POST /dobusiness HTTP/1.1
0127.170648.890 4390 [MTTask#1 ] DEBUG Socklet2HTTP - [SockletHTTP] [cmd]POST [loc] /dobusiness[length]209
0127.170648.890 4390 [MTTask#1 ] DEBUG Socklet2HTTP - [Socklet2HTTP:doPOST]收到报文:[dobusiness]$xmldata=<?xml version="1.0" encoding="GBK"?><ShBOSS> <ReqDate>20080125</ReqDate> <ReqTime>115900</ReqTime> <FunCode>T3101002</FunCode> <Calling>13520478150</Calling> <TransIDO>TransIDO0001</TransIDO></ShBOSS>
0127.170648.890 4390 [MTTask#1 ] DEBUG Service4QObj - isActive()...
0127.170648.890 4390 [MTTask#1 ] DEBUG Service4QObj - isActive()...
0127.170648.890 4390 [MTTask#1 ] INFO Socklet2HTTP - b = false
0127.170648.890 4390 [MTTask#3 ] DEBUG HttpRecvQ - [FUNCODE]T3101002
<?xml version="1.0" encoding="utf-8"?>
<ShBOSS>
<ReqDate>20080125</ReqDate>
<ReqTime>115900</ReqTime>
<FunCode>T3101002</FunCode>
<Calling>13520478150</Calling>
<TransIDO>TransIDO0001</TransIDO>
</ShBOSS>


0127.170648.890 4390 [MTTask#3 ] INFO SendToMpsp - {HostID=UmpaySP, reqTrace=TransIDO0001, rpid=b100210000000007, funCode=T3101002, reqDate=20080125, reqTime=115900, calling=13520478150}
0127.170648.890 4390 [MTTask#3 ] DEBUG UH16ReaderB2 - sendXml(UmpaySP,60s)...
0127.170648.890 4390 [MTTask#3 ] DEBUG NamedSocketPool - getSocket(UmpaySP)...PS[127.0.0.1:20021/L:1262]
0127.170648.890 4390 [MTTask#3 ] DEBUG NamedSocketPool - sendMsg.1(UmpaySP)...ok 298
0127.170648.906 4406 [MTTask#2 ] WARN UH16ReaderB - ver2=0x0313, mit2=0x0080, len4=298
0127.170648.906 4406 [MTTask#3 ] INFO SendToMpsp - In SendMap:2
0127.170648.906 4406 [MTTask#2 ] WARN UH16ReaderB - recvXml()...active
0127.170648.906 4406 [MTTask#2 ] DEBUG UH16ReaderB - recvXml()...
<?xml version="1.0" encoding="GBK" ?>
<xmlMobile>
<rpid>b100210000000007</rpid>
<funCode>T3101002</funCode>
<calling>13520478150</calling>
<reqDate>20080125</reqDate>
<reqTime>115900</reqTime>
<reqTrace>TransIDO0001</reqTrace>
<HostID>UmpaySP</HostID>
</xmlMobile>

0127.170648.906 4406 [MTTask#2 ] INFO SocketXmop - s.hashCode() 19058102
0127.170648.906 4406 [MTTask#2 ] INFO SocketXmop - {calling=13520478150, msgNum=0, funCode=T3101002, reqTrace=TransIDO0001, HostID=UmpaySP, reqDate=20080125, reqTime=115900, transNum=0, rpid=b100210000000007}
0127.170648.906 4406 [MTTask#2 ] INFO SocketXmop - step 2
0127.170648.906 4406 [MTTask#2 ] DEBUG Service4QObj - isActive()...
0127.170648.906 4406 [MTTask#2 ] DEBUG Service4QObj - isActive()...
0127.170649.890 5390 [MTTask#1 ] DEBUG Socklet2Generic - close()...
0127.170649.890 5390 [MTTask#1 ] DEBUG WrapperSocket - * PS[127.0.0.1:1263/L:9000]...closed
老紫竹 2008-01-27
  • 打赏
  • 举报
回复
是否方便把你的那个连续2次的日志发上来看一下
我依然怀疑你的JDK版本,你能否更新到6.0u4 看看!
ustbsjl 2008-01-27
  • 打赏
  • 举报
回复
把你的本地的servlet 不要去访问别的服务器,而是马上返回 --- 马上返回是不会出现这个问题的
只有一次,那我就怀疑你的那个servlet有问题了!--- 为什么我用web访问的时候就是只出现一次,而直接用java写一个Test类就会出现两次?
你测试让你的程序直接去连接你的那个别的服务器看看,是不是依然存在2次访问的情况 --- 别的服务器暂时无法访问
老紫竹 2008-01-27
  • 打赏
  • 举报
回复
不到1秒??? 太短了!
我提供一个测试想法,我们来判断看看!

把你的本地的servlet 不要去访问别的服务器,而是马上返回
看看这种情况下是不是依然发送2次请求
1 依然2次,你的JDK肯定有问题
2 只有一次,那我就怀疑你的那个servlet有问题了!
3 你测试让你的程序直接去连接你的那个别的服务器看看,是不是依然存在2次访问的情况

ustbsjl 2008-01-27
  • 打赏
  • 举报
回复
up,大家一起讨论
ustbsjl 2008-01-27
  • 打赏
  • 举报
回复
不到一秒的时间
老紫竹 2008-01-27
  • 打赏
  • 举报
回复
通过我服务器的日志确实看到了两次请求?
大约间隔多少秒?
ustbsjl 2008-01-27
  • 打赏
  • 举报
回复
问题1:
为什么没有很快响应?
因为发过来的请求我要转发到别的服务器去处理

问题2:
你在服务器端看到了第二次请求了?
通过我服务器的日志确实看到了两次请求,而且我用的也是1.5的版本
httpConn.setConnectTimeout(30000);
httpConn.setReadTimeout(30000);
都已经设置

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧