В Java сокет, запрашивающий веб-страницу, всегда отключается - PullRequest
1 голос
/ 22 июля 2010

Я запрашиваю веб-страницу с такими сокетами:

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();
}

Однако, программа, кажется, ждет, пока время ожидания соединения не истекло. Я отладил цикл, и я абсолютно уверен, что вызывается break, но пользовательский интерфейс не обновляется, пока не будет разорвано соединение. (Это занимает более 10 секунд.) После этого IP-адрес виден, так что я уверен, что в какой-то момент был вызван break. Я также попытался использовать веб-сайт www.whatismyip.org, и он заканчивается через две секунды.

Ответы [ 4 ]

1 голос
/ 22 июля 2010

Вам необходимо проверить заголовок длины содержимого, возвращаемый сервером.Только прочитайте столько байтов, затем закройте соединение после этого.

Вы ждете, пока сервер не закроет соединение, поэтому это занимает 20 секунд.

1 голос
/ 22 июля 2010

Операция (пере) рисования экрана выполняется тем же потоком, который отвечает за чтение содержимого объекта читателя. Это классический пример использования многопоточности, так что на процесс чтения экрана не влияет процесс чтения ответа.

РЕДАКТИРОВАТЬ: На основе полученных комментариев поведение может быть объяснено тем фактом, что и клиент, и сервер должны выполнять операции очистки, когда сокет внезапно закрыт. Проще говоря, клиент, кажется, не считывает все данные из входного потока, и, следовательно, JVM и, следовательно, ОС выполняет намного больше времени, чем обычно, для выполнения соответствующих операций, которые фактически высвобождают ресурсы, что приводит к очевидной блокировке какой-то разновидности. Таким образом, совет, предоставленный другими пользователями по использованию URL / URLConnection, в этом случае очень действителен.

0 голосов
/ 22 июля 2010

readLine ожидает новой строки, которую сервер никогда не отправляет

0 голосов
/ 22 июля 2010

я мог бы бросить разрыв в блоке catch после чтения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...