С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/32: Рейтинг темы: голосов - 32, средняя оценка - 4.88
0 / 0 / 2
Регистрация: 30.06.2011
Сообщений: 173

Работа с Socket(ами)

27.09.2006, 21:27. Показов 6241. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день!
В данный момент разбираюсь со следующей вещью - хочу используя класс Socket, подконектится к Http-серверу и скачать с него русурс.
Я пока добился вот чего: есть работающий Tomcat, на котором крутится приложение TestApp. Если я запускаю нижеследующий код, то все что я хочу мне дают, короче все Ok
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
            Socket socket    = new Socket("127.0.0.1", 8080);
            OutputStream os   = socket.getOutputStream();
            boolean autoflush = true;
            PrintWriter out   = new PrintWriter( socket.getOutputStream(), autoflush );
            BufferedReader in = new BufferedReader(
                new InputStreamReader( socket.getInputStream() ));
            // send an HTTP request to the web server
            out.println("GET /TestApp/index.jsp HTTP/1.1");
            out.println("Host: localhost:8080");
            out.println("Connection: Close");
            out.println();</STRONG>
            // read the response
            boolean loop    = true;
            StringBuffer sb = new StringBuffer(8096);
            while (loop) {
                if ( in.ready() ) {
                    int i=0;
                    while (i!=-1) {
                        i = in.read();
                        sb.append((char) i);
                    }
                    loop = false;
                }
                Thread.currentThread().sleep(10);
            }
Непонятки же начинаются вот в каком случае:
если я в Http-реквесте в качестве ресурса укажу не /TestApp/index.jsp, а просто /TestApp. Страница index.jsp включена в wellcome-filelist. В общем по идее должно сработать, но у меня почему то облом, - сервер возвращает следующий ответ:
HTTP/1.1 302 Moved Temporarily
Location: http://localhost:8080/TestApp/ <STRONG>http://localhost:8080/TestApp/
Content-Length: 0
Date: Wed,
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.09.2006, 21:27
Ответы с готовыми решениями:

Невозможно создать Socket: Socket sock = new Socket(someHostString,somePortInt);
Народ! Помогите пожалуйста. Вся красота губится на exception что выскакивает в момент создания сокета: Socket sock = new...

Работа с TextBox'ами Button'ами.
Народ киньте ссылку где это кратко и доступно описывает. Конкретнее как работать с тем что введено в TextBox и как определять действия...

необходим простинький пример работы c socket-ами
необходим простинький пример работы c socket-ами где бы была реализована отправка сообщения на конкретный ip и прослушивание ответа от...

27
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
27.09.2006, 23:04
Все, что приходит в голову по этому поводу, так это неверные окончания строк. Спека говорит, что строки должны заканчиваться на CRLF. Так ли это в твоем случае?



Больше пока идей нету.
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
27.09.2006, 23:05
Да, и еще, может не стоит autoflush использовать. А флашить после того, как запрос сформирован.
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
27.09.2006, 23:10
Ха, фигня все это =)))))) Все проще =))

Тебе ж сервер говорит, какой URI надо использовать (Location). Вот и используй его =))
0
0 / 0 / 2
Регистрация: 30.06.2011
Сообщений: 173
27.09.2006, 23:10  [ТС]
собственно у меня долгое время ваще ничего не получалось, - пока где-то не нашел вот этот кусок кода, до этого я делал примерно тоже самое тока писал напрямую в outputstream, не через PrintWriter.
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
27.09.2006, 23:11
См. Section 10.3.3 RFC 2616.
0
0 / 0 / 2
Регистрация: 30.06.2011
Сообщений: 173
27.09.2006, 23:12  [ТС]
если можно кодом ответьте?!, пжст
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
27.09.2006, 23:21
Нашел, говоришь. Не сам, значит, написал. Тогда позволь поругать =))
Цикл я бы переписал вот так.
Java
1
2
3
4
5
6
            // read the response
            String s;
            StringBuffer sb = new StringBuffer(8096);
            while ((s = in.readLine()) != null) {
                sb.append(s).append("");
            }
Раз спека говорит, что CRLF должно быть, так и делай так, чтобы именно они и были. Для этого, забудь про println(). print() можно использовать, но явно указывай CRLF, например, вот так:
Java
1
out.print("GET /TestApp/index.jsp HTTP/1.11512");
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
27.09.2006, 23:24
Нет, кодом нельзя. Да и ни к чему.



Сервер и так тебе возвращает URI, на который надо идти. Он же говорит тебе, что правильный URI -- это http://localhost:8080/TestApp/. То есть ты должен сформировать новый запрос уже с этим адресом, и послать его, как и первый. Повторять, пока не получишь код ответа 2хх, где хх -- любые дые десятичные цифры.
0
mishgun
28.09.2006, 00:54
Reshil vlezt

izpolzovat Socket v servlete - ne est good.

Dlya Vashih goals vi mozhete ispolzovat HttpURLConnection.
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
28.09.2006, 00:56
Тоже верно
0
0 / 0 / 2
Регистрация: 30.06.2011
Сообщений: 173
28.09.2006, 18:10  [ТС]
2 mishgun, сервлет здеся не причем, я просто разбираюсь с этими сокетами, а что касается HttpUrlConnection, - мы не ищем легких путей
Ессно если использовать HttpUrlConnection получая его от URL, - все прекрасно работает. Просто, еще раз повторюсь, я хочу попробывать реализовать это на более низком уровне.
Ковырялся в коде этого HttpUrlConnectio, но че то пока до конца не разобрал его. Кстати тама как раз используется PrintWriter.
2 danissimo, наскока я понял схема такая, - надо сразу после получения подобного ответа(302) послать аналогичный запрос еще раз, где в параметрах указать уже тот путь который у респонса в Location?!
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
28.09.2006, 18:31
Совершенно верно
0
0 / 0 / 2
Регистрация: 30.06.2011
Сообщений: 173
29.09.2006, 16:49  [ТС]
И все же от теории перейдя к практике получаем следующее:
1. Как я ни пытался, - явное испольщование CRLF ни к чему не привело, т.е. я подставлял *15*12 и *12*15 и 1310 и
и прочие комбинации, наконец пробовал напрямую писать в outputstream, - эфект оказался нулевой. Судя по исходникам PrintWriter(а) там в качестве CRLF берется некая послед-ть байт которая берется откуда-то из пропертей...
2. а ешо я стокнулся таким вот моментом:
после того как я получил первый ответ от сервера с кодом 302 и указанием нужного ресурса, - я пытюсь повторно послать запрос на сервер уже с нужным ресурсом, - таким же образом что и первый. Пытаюсь я это сделать через тот же самый сокет, - в ответ "молчание". Лечится только созданием нового объекта Socket.
3. Насколько я понял - в параметрах реквеста можно указать тип Connection, - не только close, но и Keep-alive, - в теории мне все понятно. Но вот на практике я не могу поянть почему если я в своем случае делаю connection: Keep-alive, - то происходит тоже самое что и при Connection: close, только ответ приходит не мгновенно а секунд через 5...
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
29.09.2006, 17:37
Что может быть не так.



1. Честно говоря, не понял, что означает "ни к чему не приводило". Ты ж получаешь ответ. Просто ты запускаешь свою софтину на Windows. И к счастью конец строки в Windows и есть CRLF. Запустив на Unix, результата не получишь, так как сервер не поймет твой запрос.



2.

а) Можно попробовать послать

GET /TestApp/ HTTP/1.1

Host: localhost:8080

вместо GET http://localhost:8080/TestApp/ HTTP/1.1



б) Миллион людей попадают в одну и ту же яму. PrintStream/PrintWriter ничего не скажет, если он не смог записать в поток. Вероятно, в твоем случае, так как Connection: Close, выходной поток закрывается, а ты об этом и не знаешь.



Как лечить? Либо не использовать PrintStream/Writer, либо спросить у него checkError().



3. Нет идей. Могут появиться, если увижу код.
0
mishgun
29.09.2006, 21:27
Ya ne ponyal odnogo - afftar mne tut utverzhdaet chto servletami tut i ne pahnet a u samogo v pervom poste i jsp i Httprequest i fsyo takoe. Obmanivaem da?

Ya VAn povtoryayu nehorosho ispolzovat Socket v servlet,jsp i voobsche v j2ee prilozhenii...
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
29.09.2006, 21:39
mishgun, не кипятись =)), похоже, чел просто учится с сетью взаимодействовать. Почему бы и не таким образом.



Аффтар, mishgun прав в том, что не стоит самому писать HTTP клиента, если нету обоснованной необходимости.
0
paradise
15.10.2006, 04:27
GET http://localhost:8080/TestApp/ HTTP/1.1


Так делать не надо.



/TestApp/index.jsp, а просто /TestApp.


Помоему сервер тебе отвечает внятно: "То, что ты запросил - его сейчас нет. Временно... Но есть тоже самое, только со слешем на конце. Но просто так я тебе его не дам. Поэтому попроси еще раз..." На языке сервера это звучит как "302".



А в сокет ты писать не можешь т.к. сервер его со своей стороны закрыл. О чем он тебе честно сообщил в ответе. Вернее писать ты как раз можешь. Только читать никто не будет. На livejournal похоже.



И вообще, не занимайся ерундой. Определись, что ты хочешь изучать - сокеты или http. Иначе классических проблем не избежать.
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
18.10.2006, 20:26
Звучит это забавно, что ресурс отсутствует временно. Он за пивом побежал и предупредил сервер, что будет через 10 минут. . Что означает 302 - Moved Temporarily? И кто его moved ? И зачем?
У нас постоянно этот код выскакивает в localhost_access_log на томкате при вызове jsp, которая в конце делает response.sendRedirect("..."); Очевидно, 302 и означает редирект. Разве можно было догадаться об этом, читая спецификацию?
0
paradise
20.10.2006, 01:23
Теоретически, теория и практика - это одно и тоже, на практике - это совершенно разные вещи (с). Пока не попробуешь, не будешь знать наверняка.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2006, 01:23
Помогаю со студенческими работами здесь

TreeView с checkbox`ами и DBGrid c combobox`ами
Здравствуйте, посдкажите, пожалуйста, как реализовать checkbox`ы в компоненте TreeView и combobox`ы в компоненте DBGrid, которые будут...

Работа с Mutant'ами
Проблема следующая: Есть приложение, копию которого можно запустить, только если убить в нем один Mutant. Я написал консольное...

работа с TextBox-ами
есть несколько тестбоксов. начинаем набирать информацию в первое поле как только в этом поле набралось несколько символов (например 5) ...

Работа с comboBox-ами
Здравствуйте, подскажите пожалуйста как осуществить следующее: имеется comboBox1(страны) и comboBox2(города). Необходимо, чтобы при выборе...

Работа с div-ами
Здравствуйте. Что сделсать чтобы синий div был в центре зеленого. Я пишу margin: 150px auto , но зеленый div тоже на 50px спускается.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru