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

在Java中,请求网页的套接字总是超时

  •  1
  • Overv  · 技术社区  · 15 年前

    我请求一个带有如下套接字的网页:

    Socket sock = null;
    PrintWriter out = null;
    BufferedReader in = null;
    
    try {
        sock = new Socket( "www.overvprojects.nl", 80 );
        out = new PrintWriter( sock.getOutputStream(), true );
        in = new BufferedReader( new InputStreamReader( sock.getInputStream() ) );
    } catch ( UnknownHostException e ) {
        e.printStackTrace();
    } catch ( IOException e ) {
    e.printStackTrace();
    }
    
    out.println( "GET /ip.php HTTP/1.1" );
    out.println( "Host: www.overvprojects.nl" );
    out.println( "" );
    out.flush();
    
    String buf = "";
    
    while ( buf != null )
    {
        try {
            buf = in.readLine();
        } catch ( IOException e ) {
            e.printStackTrace();
        }
    
        if ( buf != null && Pattern.matches( "^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$", buf ) ) {
            ipText.setText( buf );
    
            break;
        }
    }
    
    try {
        in.close();
        out.close();
        sock.close();
    } catch ( IOException e ) {
        e.printStackTrace();
    }
    

    4 回复  |  直到 15 年前
        1
  •  1
  •   Byron Whitlock    15 年前

    您需要检查服务器返回的content-length头。只读取那么多字节,然后关闭连接。

    您正在等待,直到服务器关闭连接,这就是为什么它需要20秒。

        2
  •  1
  •   Vineet Reynolds    15 年前

    重新绘制屏幕的活动恰好由负责读取reader对象内容的同一线程完成。这是一个使用多线程的经典示例,这样屏幕渲染就不会受到读取响应过程的影响。

    编辑: 根据收到的注释,这种行为可以解释为当套接字突然关闭时,客户端和服务器都需要执行清理操作。简单地说,客户机似乎并没有从输入流中读取所有数据,因此JVM和操作系统执行实际释放资源的适当操作所需的时间要比通常长得多,从而导致某种类型的明显锁定。因此,其他人提供的使用URL/URLConnection的建议在这种情况下非常有效。

        3
  •  0
  •   Aaron Anodide    15 年前

    看完这本书后,我可能会在接球台上休息一下

        4
  •  0
  •   irreputable    15 年前

    推荐文章