在public ActionForward execute(ActionMapping mapping,ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException, SAXException {
里面  通过url连接 访问 另一台服务器。
    con = (HttpURLConnection) aUrl.openConnection(); 
         
//我想让他如果连接不上,就 继续循环访问 下一台服务器。     
     if(con.getResponseCode()!= 200){
              continue;
             }
但是 如果 有一台 服务器连接不上,程序好像 一直就试图连接,最后显示如下错误。
描 述 服务器遇到内部错误,无法满足这个访问请求异 常 java.net.ConnectException: Connection timed out: connect
java.net.PlainSocketImpl.socketConnect(Native Method)
java.net.PlainSocketImpl.doConnect(Unknown Source)
java.net.PlainSocketImpl.connectToAddress(Unknown Source)
java.net.PlainSocketImpl.connect(Unknown Source)
java.net.Socket.connect(Unknown Source)
java.net.Socket.connect(Unknown Source)
sun.net.NetworkClient.doConnect(Unknown Source)
sun.net.www.http.HttpClient.openServer(Unknown Source)
sun.net.www.http.HttpClient.openServer(Unknown Source)
sun.net.www.http.HttpClient.<init>(Unknown Source)
sun.net.www.http.HttpClient.New(Unknown Source)
sun.net.www.http.HttpClient.New(Unknown Source)
sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
com.searchforyou.action.SearchAllAction.execute(SearchAllAction.java:139)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
com.searchforyou.filters.CharFilter.doFilter(CharFilter.java:27)

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【thankyou2008】截止到2008-07-21 17:41:21的历史汇总数据(不包括此帖):
    发帖的总数量:19                       发帖的总分数:1380                     每贴平均分数:72                       
    回帖的总数量:26                       得分贴总数量:5                        回帖的得分率:19%                      
    结贴的总数量:17                       结贴的总分数:1180                     
    无满意结贴数:1                        无满意结贴分:40                       
    未结的帖子数:2                        未结的总分数:200                      
    结贴的百分比:89.47 %               结分的百分比:85.51 %                  
    无满意结贴率:5.88  %               无满意结分率:3.39  %                  
    楼主加油
      

  2.   


    里面 通过url连接 访问 另一台服务器。
        con = (HttpURLConnection) aUrl.openConnection();
           
    //我想让他如果连接不上,就 继续循环访问 下一台服务器。    
        if(con.getResponseCode()!= 200){
                continue;
                } 把这一段循环的代码帖出来看下
      

  3.   

    java.net.ConnectException: Connection timed out就是连不上,一定时间后超时报异常了。
      

  4.   

    for (int i=0;i<servers.getLength();++i){
                             //下面两行是 从 一个xml文件中得到  url的代码。其中url格式为http://192.168.1.102:8080/
     Element serveritem=(Element) servers.item(i);
     String url =serveritem.getElementsByTagName("url").item(0).getFirstChild().getNodeValue();

     aUrl = new URL(url+"SearchForYou/SearchCellAction.do?searchContent="+ URLEncoder.encode(searchContent,"UTF-8"));   
                 //打印一下 aurl
     System.out.println(aUrl);
             con = (HttpURLConnection) aUrl.openConnection(); 
             
             if(con.getResponseCode()!= 200){
                 continue;
                  }
             
                    
             con.setDefaultUseCaches(false);   
             con.setUseCaches(false);   
             
    //           指示应用程序要从 URL 连接读取数据
             con.setDoOutput(true);  
             con.setDoInput(true);//
                 con.connect(); 
                 
                
    //             
    //          
    //           
                 //从Url连接中获取输入流信息 (即:服务器的输出流信息)
             InputStream in = con.getInputStream();        
             objectInputStream = new ObjectInputStream(in);
             
                 try {
                  serializeObject= objectInputStream.readObject();
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    linkedListCell=(LinkedList) serializeObject;

    objectInputStream.close();

    //把从 每一个服务器内 获取的 记录集加到内存 中的静态链表 中
    SearchResultLinkedListUtil.linkedList.addAll(linkedListCell);
    }
      

  5.   

            con = (HttpURLConnection) aUrl.openConnection(); 
            
            if(con.getResponseCode()!= 200){ 
              continue; 
                  } 
    我想改成这样怎么样
    try{
            con = (HttpURLConnection) aUrl.openConnection(); 
            
            if(con.getResponseCode()!= 200){ 
              continue; 
           }    } catch(){
              continue;
        }
      

  6.   

    catch  一个异常ConnectException
      

  7.   

    try{
            con = (HttpURLConnection) aUrl.openConnection(); 
            
            if(con.getResponseCode()!= 200){ 
              continue; 
           }     } catch(Exception e){
              continue;
        }
    这一个解决方法,会产生一个 问题,如果  con = (HttpURLConnection) aUrl.openConnection(); 如果 有一个连接有问题,它会试图连接好多次,
                                                   我也不知道 系统 试图连接 了几次,?
                                问题是,这样有一台机子  有问题,我整个 的查询时间 就会很长,有没解决的办法?laorer老师。
      

  8.   

    代码太乱,先格式化下:for (int i = 0; i < servers.getLength(); ++i) {
    //下面两行是从一个xml文件中得到url的代码。其中url格式为http://192.168.1.102:8080/
    Element serveritem = (Element) servers.item(i);
    String url = serveritem.getElementsByTagName("url").item(0).getFirstChild().getNodeValue();
    aUrl = new URL(url + "SearchForYou/SearchCellAction.do?searchContent=" + URLEncoder.encode(searchContent,"UTF-8"));
    //打印一下 aurl
    System.out.println(aUrl);
    con = (HttpURLConnection) aUrl.openConnection();
    if (con.getResponseCode() != 200) {
    continue;
    }
    con.setDefaultUseCaches(false);
    con.setUseCaches(false);
    //指示应用程序要从 URL 连接读取数据
    con.setDoOutput(true);
    con.setDoInput(true);
    con.connect();
    //从Url连接中获取输入流信息 (即:服务器的输出流信息)
    InputStream in = con.getInputStream();
    objectInputStream = new ObjectInputStream(in);
    try {
    serializeObject= objectInputStream.readObject();
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    linkedListCell = (LinkedList) serializeObject;
    objectInputStream.close();
    //把从每一个服务器内获取的记录集加到内存中的静态链表中
    SearchResultLinkedListUtil.linkedList.addAll(linkedListCell);
    }
      

  9.   

    URL.openConnection()先setConnectTimeout();然后再getInputStream() ;
    http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=20964\
    **看下,http://www.5do8.com/blog/doc/630/index.aspx不要叫我老师吧,我对这个也不熟悉,只是看你说的情况加上那个,刚刚baidu了一下,估计可以解决你的问题,你再看一下上面两个链接
    大S说得对,代码,帖出来时,最好整理一下,然后再加上相应的格式, 要不看起来不舒服
      

  10.   

    1.  con.setDefaultUseCaches(false);
          con.setUseCaches(false);
        jdk文档上说:
             将此 URLConnection 的 useCaches 字段的值设置为指定的值。 
    有些协议用于文档缓存。有时候能够进行“直通”并忽略缓存尤其重要,例如浏览器中的“重新加载”按钮。如果连接中的 UseCaches 标志为 true,则允许连接使用任何可用的缓存。如果为 false,则忽略缓存。默认值来自 DefaultUseCaches,它默认为 true。 
    参数:
    usecaches - 一个指示是否允许缓存的 boolean 值             这一点不太明白,比如它的 缓存 指的 是什么呢 ?
               对我 这个 连接,他代表什么 意思呢 ?
        2.我已经 在前面 使用了 con = (HttpURLConnection) aUrl.openConnection();
    用openconnection方法打开了一个连接,后面 又con.connect();这样 会不会重复?谢谢。
      

  11.   

    在出现异常的环节上做出具体响应处理,如果一个环节出现问题。彻底终止以后的所以链接con应该关闭掉,并把错误信息返回给客户