我有一个接受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();
} }
}
如果我的服务端没有很快的响应这个请求的话,服务端马上会收到客户端的第二次请求,客户端自动重发了一次,请教各位大虾是否碰到过这种情况,如何解决?

解决方案 »

  1.   

    1 你用IE访问你的服务器端看看,是不是也出现2次请求
    2 客户端代码是很普通的,没有发现什么问题,
    你的 _log.debug("urlc.send()...");
    难道打印了2次??
      

  2.   

    你用IE访问你的服务器端看看,是不是也出现2次请求   我用浏览器访问的话怎么发报文体,我需要用POST方法,这样不是需要一个表单吗?
    你的   _log.debug("urlc.send()..."); 难道打印了2次?? 不是的,只有一次
      

  3.   

    不会弄啊,用IE访问服务器端能不能设置是POST请求啊
      

  4.   

    你做一个表单不会吗?test.htm<form method="POST" action="http://localhost:9000/dobusiness">
    <input type="submit"/>
    // 其他参数你自己加吧!我不清楚了
    </form>
      

  5.   

    这个我弄好了,用IE发送的请求我只收到一个,但是现在又有一个新的问题,是不是用浏览器请求的话每次都会有一个Get请求,请求网站的LOGO,每次都会有GET /favicon.ico HTTP/1.1
    然后我的服务端就会
    java.io.FileNotFoundException: \favicon.ico (系统找不到指定的路径。)
      

  6.   

    是的! 这个是地址前面的那个小图标的
    比如CSDN 的那个大大的 C
    google 的那个 G
      

  7.   

    如果我的服务端没有很快的响应这个请求的话,服务端马上会收到客户端的第二次请求问题1:
      为什么没有很快响应?
    问题2:
      你在服务器端看到了第二次请求了?我并不认为,URLConnection 会自动重试,我的是 1.5 和 1.6 版本http://blog.yesky.com/Blog/yangsy/archive/2005/04/01/99445.html你用的难道是 1.4? 难道是一个BUG你的setSoTimeout 还是打开吧!免得有问题!!
      

  8.   

    问题1: 
        为什么没有很快响应?
    因为发过来的请求我要转发到别的服务器去处理问题2: 
        你在服务器端看到了第二次请求了?
    通过我服务器的日志确实看到了两次请求,而且我用的也是1.5的版本
    httpConn.setConnectTimeout(30000);
    httpConn.setReadTimeout(30000);
    都已经设置
      

  9.   

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

  10.   

    把你的本地的servlet   不要去访问别的服务器,而是马上返回  --- 马上返回是不会出现这个问题的
    只有一次,那我就怀疑你的那个servlet有问题了!---   为什么我用web访问的时候就是只出现一次,而直接用java写一个Test类就会出现两次?
    你测试让你的程序直接去连接你的那个别的服务器看看,是不是依然存在2次访问的情况 --- 别的服务器暂时无法访问
      

  11.   

    是否方便把你的那个连续2次的日志发上来看一下
    我依然怀疑你的JDK版本,你能否更新到6.0u4 看看!
      

  12.   

    ===== 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
      

  13.   

    我怎么没看到2次请求呢??
    [Socklet2HTTP:doPOST]收到报文 

    DEBUG   HttpRecvQ                 -   [FUNCODE]T3101002明显是你的日志程序的输出了2次,并不是你的程序调用了2次!