Кто глючит - сокеты или я?

 
 
 
Сообщения:8
Программирую в Java недавно, и вот возник у меня вопрос. Есть код

Socket s = new Socket( "127.0.0.1", 80 );
InputStream istream = s.getInputStream();
OutputStream ostream = s.getOutputStream();
String request = "GET http://localhost/test.pl HTTP/1.1\nHost: localhost\n\n";

ostream.write(request.getBytes());
ostream.flush();

byte buf[] = new byte[10000];
int cur_len = 0;
do
{
        cur_len = istream.read( buf, cur_len, buf.length - cur_len );
 
} while( cur_len > 0 );

String sss = new String(buf)
System.out.println(sss);


Этот код выводит на java-консоль результат некоего PERL скрипта. Он прекрасно работает но... только 1 раз!.
Тоесть если еще раз послать запрос GET к томуже скрипту, или к другому, неважно, то istream.read сразу возвращает 0 байт прочитано, и всё :(. Приходится закрывать сокет s.close() и снова открывать его т.е. s = new Socket( "127.0.0.1", 80 );

Вопрос - я чтото не так делаю, или сокет и должен быть одноразовым, и для каждого запроса его переоткрывать надо?

З.Ы. пробовал под localhost Apache и IIS5.1, а также на fatal.ru - результат один :(

Все фигня, кроме пчел... А впрочем - пчелы тоже фигня!
 
 
Сообщения:1688
В методе InputStream.read(buf, offset, len) второй параметр - это смещение в массиве buf, а не в потоке (поток сам сохраняет позицию последнего считанного байта, поэтому нельзя считать поток из любой позиции, а только последовательно). Параметр len - размер массива buf, говорит методу read сколько максимально можно считать байт в этом вызове (в принципе логично).
Таким образом должно быть так:
cur_len = istream.read( buf, 0, buf.length );
 
 
Сообщения:8
2 Vlad
Исправил - не помогло к сожалению :(

Первый запрос GET отрабатывает нормально, сервер возвращает:

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Thu, 17 Aug 2006 23:32:54 GMT
Content-Type: text/html; charset=windows-1251
X-Powered-By: ASP.NET
Connection: close

HELLO WORLD form PERL!!!



а все последующие - не работают, пока не сделаешь s.close(); s = new(...);

Все фигня, кроме пчел... А впрочем - пчелы тоже фигня!
 
 
Сообщения:3874
Я бы хотел Вам задать вопрос - а может то, что вы задумали можно сделать другим способом? Вам обязательно получать соединение ТАК? Какую цель вы приследуете? Какую задачу Вы пытаетесь решить таким способом?
 
 
Сообщения:8
2 gesser

Да в принципе никаких сверхзадач не решаю, просто решил изучить Java, вот и тренируюсь (на кошках :) ). Вообще я давно на С++ программирую, а при переходе на Java такие вот мелкие затыки постоянно всплывают, вот и разбираюся потихоньку :wink:

Все фигня, кроме пчел... А впрочем - пчелы тоже фигня!
 
 
Сообщения:3874
Я не просто спрашиваю, эту задачу можно решить, например, через библиотеку HttpClient
 
 
Сообщения:8
За ссылку спасибо, попробую покопаться в исходниках.

А вообще в перспективе, идея была такой - есть простенькие java-games типа тетриса, арканоида и т.п.. Ну и соответственно имеется таблица рекордов всех юзеров которая хранится на сервере. А апплеты с играми ее считывают, добавляют новый рекорд и засылают обратно на сервер.

Все фигня, кроме пчел... А впрочем - пчелы тоже фигня!
 
 
Сообщения:3874
Пример использования ...

http://www.javatalks.ru/ftopic31.php
 
 
Сообщения:1688
Zavulon666:
2 Vlad
Исправил - не помогло к сожалению :(

Первый запрос GET отрабатывает нормально, сервер возвращает:
...
а все последующие - не работают, пока не сделаешь s.close(); s = new(...);

Всё работает:
Socket s = new Socket( "127.0.0.1", 80 );
InputStream istream = s.getInputStream();
OutputStream ostream = s.getOutputStream();
String request = "GET http://localhost/test.pl HTTP/1.1\nHost: localhost\n\n";

ostream.write(request.getBytes());
ostream.flush();

byte buf[] = new byte[10000];
int cur_len = 0;
do
{
        cur_len = istream.read( buf, 0, buf.length );
        if (cur_len > 0) {
            String sss = new String(buf, 0, cur_len);
            System.out.print(sss); 
        }
} while( cur_len > 0 );
s.close();
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет