代码之家  ›  专栏  ›  技术社区  ›  rdllopes

applet httpurlconnection chunked响应问题

  •  0
  • rdllopes  · 技术社区  · 15 年前

    我有一个与IIS6.0服务器有httpurlConnection的小程序。 服务器响应分块数据,但有时(某些浏览器)我有问题。 服务器应答卡在一定的缓冲区中,当服务器超时关闭连接时到达我。

    url = new URL(urlStr); 
    huc = (HttpURLConnection) url.openConnection();
    huc.setDefaultUseCaches(false); 
    huc.setAllowUserInteraction(true);
    huc.setDoInput(true);
    huc.setUseCaches(false);
    huc.setRequestProperty("Pragma", "no-cache");
    huc.setRequestProperty("Cache-Control", "no-cache");
    huc.setRequestProperty("Expires", "-1");
    huc.setRequestProperty("Content-type", "text/html");
    InputStream is = huc.getInputStream();
    ... 
    while (!trunkStop) {
      while (errorConnection && !trunkStop) {
        connectToServer();
         if (errorConnection) {
           sleepThread();
         }
      }
    
      while (!errorConnection && !trunkStop) {
                readData();
      }
     ...
    }
    ...
    void readData() {
        if (trunkStop) {
            return;
        }
        try {
            readLine();
            addTask();//put to task queue
        } catch (Exception e) {
            getLogger().log(Level.WARNING, "Error connection...");
        }
    }
    ...
    String readLine() throws IOException, InterruptedException {
        sb = new StringBuilder();
        int prev = -1;
        while (!errorConnection && !trunkStop) {
            read = is.read();
            if (read == -1) {
                if (System.currentTimeMillis() - timer > 150000) {
                    getLogger().log(Level.SEVERE, "RECONNECT BY TIMEOUT");
                    errorConnection = true;
                }
                Thread.sleep(10);
                continue;
            } else if (read == 13) {
    
            } else if (read == 10 && prev == 13) {
                break;
            } else {
                sb.append((char) read);
                System.out.print((char) read);
            }
            prev = read;
            timer = System.currentTimeMillis();
        }
        return sb.toString();
    }
    

    某些浏览器缓冲区,我不知道。 此时,IIS已经发送了答案,这是客户端问题, IE7,Java1.60EY16

    有什么想法吗?

    2 回复  |  直到 15 年前
        1
  •  0
  •   jitter    15 年前

    readLine() 你好像在做一些奇怪的事情。

    什么时候? read==-1 (这意味着流的结束)您在设置之前等待150秒 errorConnection=true 允许 readLine 然后 readData 以及 while (!errorConnection & !trunkStop) { readData(); } 停止。

    这150秒可能比IIS服务器的连接超时时间长。


    顺便说一下,您使用的是位和运算符( & )而不是逻辑与运算符( && )你确定这就是你想要的吗?检查差异。

    & java bit-wise and operator

    && java McCarthy and operator

        2
  •  0
  •   rdllopes    15 年前

    问题解决了!

    客户端使用代理。https使用帮助