我有一个接受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();
} }
}
如果我的服务端没有很快的响应这个请求的话,服务端马上会收到客户端的第二次请求,客户端自动重发了一次,请教各位大虾是否碰到过这种情况,如何解决?
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();
} }
}
如果我的服务端没有很快的响应这个请求的话,服务端马上会收到客户端的第二次请求,客户端自动重发了一次,请教各位大虾是否碰到过这种情况,如何解决?
2 客户端代码是很普通的,没有发现什么问题,
你的 _log.debug("urlc.send()...");
难道打印了2次??
你的 _log.debug("urlc.send()..."); 难道打印了2次?? 不是的,只有一次
<input type="submit"/>
// 其他参数你自己加吧!我不清楚了
</form>
然后我的服务端就会
java.io.FileNotFoundException: \favicon.ico (系统找不到指定的路径。)
比如CSDN 的那个大大的 C
google 的那个 G
为什么没有很快响应?
问题2:
你在服务器端看到了第二次请求了?我并不认为,URLConnection 会自动重试,我的是 1.5 和 1.6 版本http://blog.yesky.com/Blog/yangsy/archive/2005/04/01/99445.html你用的难道是 1.4? 难道是一个BUG你的setSoTimeout 还是打开吧!免得有问题!!
为什么没有很快响应?
因为发过来的请求我要转发到别的服务器去处理问题2:
你在服务器端看到了第二次请求了?
通过我服务器的日志确实看到了两次请求,而且我用的也是1.5的版本
httpConn.setConnectTimeout(30000);
httpConn.setReadTimeout(30000);
都已经设置
我提供一个测试想法,我们来判断看看!把你的本地的servlet 不要去访问别的服务器,而是马上返回
看看这种情况下是不是依然发送2次请求
1 依然2次,你的JDK肯定有问题
2 只有一次,那我就怀疑你的那个servlet有问题了!
3 你测试让你的程序直接去连接你的那个别的服务器看看,是不是依然存在2次访问的情况
只有一次,那我就怀疑你的那个servlet有问题了!--- 为什么我用web访问的时候就是只出现一次,而直接用java写一个Test类就会出现两次?
你测试让你的程序直接去连接你的那个别的服务器看看,是不是依然存在2次访问的情况 --- 别的服务器暂时无法访问
我依然怀疑你的JDK版本,你能否更新到6.0u4 看看!
- 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
[Socklet2HTTP:doPOST]收到报文
和
DEBUG HttpRecvQ - [FUNCODE]T3101002明显是你的日志程序的输出了2次,并不是你的程序调用了2次!