Обнаружение разрыва EOF / TCP с использованием сокетов Java из Javascript - PullRequest
0 голосов
/ 03 апреля 2009

Я создаю сокет Java в Javascript, отправляю HTTP-запрос и правильно получаю ответ, но мне кажется, что я не могу обнаружить EOF или сервер, закрывающий сокет в конце. Что я делаю неправильно? Проблема заключается в том, что мы никогда не покидаем самый внешний цикл while - сервер прекращает передачу и (предположительно) закрывает свой конец соединения, однако receive.read () никогда не возвращает -1, и все методы сокета возвращают состояние, соответствующее сокету, который все еще подключен .

    var s = new java.net.Socket("www.google.com",80);
    var sender = new java.io.PrintStream(s.getOutputStream());
    var receiver = s.getInputStream();
    sender.print("GET / HTTP/1.0\r\n\r\n");
    sender.flush();
    s.shutdownOutput();
    var response = '';
    var eof = 0;
    while( !eof && s.isConnected() && s.isBound() && !s.isClosed() && !s.isInputShutdown() )
    {  
       if( receiver.available() )
       {
        while( receiver.available() )
        {
         var i = receiver.read();
         if( i == -1 ) { eof = 1; }
         else { response += String.fromCharCode(i); }
        }
        // at this point response does contain the expected HTTP response
       }
    }

    // in case remote end closed the socket before we got a chance to read all the bytes from it        
    // ...but this is never reached!
    while( receiver.available() )
    { 
      response += String.fromCharCode(receiver.read());
    }

    alert( response );

Ответы [ 4 ]

0 голосов
/ 03 апреля 2009

Когда достигнут конец потока, available () возвращает 0, поэтому в вашем коде вы никогда не читаете -1

0 голосов
/ 03 апреля 2009

Хорошо. Каково значение eof, когда код достигает этого комментария?
// в этот момент ответ содержит ожидаемый HTTP-ответ

Какой симптом? Я полагаю, это бесконечный цикл?

0 голосов
/ 03 апреля 2009

ОК, дальнейшие исследования показывают, что нет неблокирующего способа узнать, закрыла ли удаленная сторона сокет. Однако этого можно достичь, используя каналы NIO:

    var s = new java.nio.channels.SocketChannel.open(new java.net.InetSocketAddress( "www.google.com",80) );
    //ew, but while we're prototyping...
    s.configureBlocking(true); 
    var sender = new java.io.PrintStream(s.socket().getOutputStream());
    sender.print("GET / HTTP/1.0\r\n\r\n");
    sender.flush();

    s.configureBlocking(false); // yayy!

    var response = '';
    var len = 0;
    var dbuf = java.nio.ByteBuffer.allocate( 1024 );
    while( len >= 0 )
    {    
         len = s.read( dbuf );
         dbuf.flip();
         while( dbuf.hasRemaining() )
         { 
           response += String.fromCharCode( dbuf.get() );
         }
         dbuf.clear();
    }

    alert( response );
0 голосов
/ 03 апреля 2009

Неужели это не так:

      while( receiver.available() && !eof)

быть лучше? вместо первого времени (receive.available ())?

...