我有一个页面,里面是循环去请求一个URL(会请求的很快,是拿到请求结果后马上再去请求),
如果这个页面只开一个好象是没有问题的,但如果开两个这个页面(就是两个循环请求),其中一个页面就会报
Java.net.BindExecption  Address already in use:connect的异常(有时候两个都会),我查了下,
好象TCP/IP每次请求都会自动分配一个端口,并且有自动释放的间隔,用netstat -a 看了下,请求页面的时候果然多出很多端口,
请问这个问题有办法解决吗?

解决方案 »

  1.   

    这个我试过,一旦抛出这个异常,以后的请求将都会失败,全是抛的这个异常package com.test;import java.io.IOException;
    import org.apache.commons.httpclient.*;
    import org.apache.commons.httpclient.methods.PostMethod;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;public class PostTest extends HttpServlet
    {
    String path = "";
    int i = 0;
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
    path = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();
    PostTest ps = new PostTest();
    ps.test(path);
    }

    private void test(String path)
    {
    try
    {
    HttpClient client = new HttpClient();
    HttpMethod method = new PostMethod(path+"/test.jsp");
    client.executeMethod(method);
    method.releaseConnection();
    System.out.println("请求成功");
    test(path);
    }
    catch(Exception e)
    {
    i++;
    System.out.println("异常次数="+i);
    System.out.println("异常原因:"+e.toString());
    //test(path);
    }
    //test(path);
    }
    }这是我测试的一个Servlet,其中test.jsp基本是一个空的JSP,没有什么操作。
    如果开两个IE访问这个Servlet就会报Java.net.BindException,并且一直是请求失败的,如果在异常中再去请求,则会抛出
    java.lang.StackOverflowError异常,也说明了一但请求失败后,后面的都是失败的。
      

  2.   

    把这里
    PostTest ps = new PostTest();
    ps.test(path);
    改成
    //PostTest ps = new PostTest();
    test(path);如果LZ想做非同期并发处理,应该采用多线程,而不是创建多个Servlet对象
      

  3.   

    HttpClient client = new HttpClient(); //这里可能引起端口冲突,把client做成成员变量试试看
                HttpMethod method = new PostMethod(path+"/test.jsp");
                client.executeMethod(method);
                method.releaseConnection();
                System.out.println("请求成功");
                test(path); //这里导致堆栈溢出