powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / работа с сокетом для Alexander Kolotinets
12 сообщений из 12, страница 1 из 1
работа с сокетом для Alexander Kolotinets
    #32602138
Фотография А.Гpacoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример:

приведенный метод возвращает строку (String), в которой находится
"сырой" ответ сервера на запрос GET (то есть не только хтмл-код,
но и хидеры хттп-запроса).
в данной реализации (метод слишком сырой) параметром
httpPath указывается урл (у меня идет работа через прокси),
параметром waitForString - строка, после получения которой,
закрывается соединение (чтоб лишнее не качать).

Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
  private static String getPageContent(String httpPath, String waitForString) throws IOException {
    Socket socket = null;
    if (Settings.getInstance().isUseProxy()) {
      socket = new Socket(Settings.getInstance().getProxyHost(), Settings.getInstance().getProxyPort());
    }

    socket.setSoTimeout(Settings.getInstance().getSocketTimeout());

    PrintWriter pw = new PrintWriter(socket.getOutputStream());
    InputStreamReader isr = new InputStreamReader(socket.getInputStream());

    String request = getHeader(httpPath);

    pw.println(request);
    pw.flush();

    String answer = "";
    int readed;
    char[] buf = new char[ 512 ];

    boolean found = false;
    while ((readed = isr.read(buf)) != - 1 ) {
      String temp = String.copyValueOf(buf,  0 , readed);
      answer += temp;
      if (waitForString != null) {
        if (answer.lastIndexOf(waitForString) != - 1 ) {
          found = true;
          break;
        }
      }
    }

    pw.close();
    isr.close();

    socket.close();

    return answer;
  }

  private static String getHeader(String url) {
    String header = "GET " + url + " HTTP/1.1\r\n";
    header += "Host: www.sql.ru\r\n" +
            "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0.2) Gecko/20030208 Netscape/7.02\r\n" +
            "Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n" +
            "Accept-Language: ru, en-us;q=0.66, en;q=0.33\r\n" +
            "Referer: http://www.sql.ru\r\n" +
            "Cookie: ASP.NET_SessionId=SKIPPED\r\n" +
            "Proxy-Connection: keep-alive\r\n";
    return header;
  }

...
Рейтинг: 0 / 0
работа с сокетом для Alexander Kolotinets
    #32602289
Alexander Kolotinets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Гpacoffпример:

приведенный метод возвращает строку (String), в которой находится
"сырой" ответ сервера на запрос GET (то есть не только хтмл-код,
но и хидеры хттп-запроса).
в данной реализации (метод слишком сырой) параметром
httpPath указывается урл (у меня идет работа через прокси),
параметром waitForString - строка, после получения которой,
закрывается соединение (чтоб лишнее не качать).

Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
  private static String getPageContent(String httpPath, String waitForString) throws IOException {
    Socket socket = null;
    if (Settings.getInstance().isUseProxy()) {
      socket = new Socket(Settings.getInstance().getProxyHost(), Settings.getInstance().getProxyPort());
    }

    socket.setSoTimeout(Settings.getInstance().getSocketTimeout());

    PrintWriter pw = new PrintWriter(socket.getOutputStream());
    InputStreamReader isr = new InputStreamReader(socket.getInputStream());

    String request = getHeader(httpPath);

    pw.println(request);
    pw.flush();

    String answer = "";
    int readed;
    char[] buf = new char[ 512 ];

    boolean found = false;
    while ((readed = isr.read(buf)) != - 1 ) {
      String temp = String.copyValueOf(buf,  0 , readed);
      answer += temp;
      if (waitForString != null) {
        if (answer.lastIndexOf(waitForString) != - 1 ) {
          found = true;
          break;
        }
      }
    }

    pw.close();
    isr.close();

    socket.close();

    return answer;
  }

  private static String getHeader(String url) {
    String header = "GET " + url + " HTTP/1.1\r\n";
    header += "Host: www.sql.ru\r\n" +
            "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0.2) Gecko/20030208 Netscape/7.02\r\n" +
            "Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n" +
            "Accept-Language: ru, en-us;q=0.66, en;q=0.33\r\n" +
            "Referer: http://www.sql.ru\r\n" +
            "Cookie: ASP.NET_SessionId=SKIPPED\r\n" +
            "Proxy-Connection: keep-alive\r\n";
    return header;
  }



большое спасибо за содержательный пример, респект.
А что передается в качестве httpPath и как передаются параметры username, password для прокси?
...
Рейтинг: 0 / 0
работа с сокетом для Alexander Kolotinets
    #32602313
Фотография А.Гpacoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Kolotinetsбольшое спасибо за содержательный пример, респект.
А что передается в качестве httpPath и как передаются параметры username, password для прокси?

я ж написал, что в httpPath передаешь урл, например, "http://www.sql.ru"
...
Рейтинг: 0 / 0
работа с сокетом для Alexander Kolotinets
    #32602386
Фотография А.Гpacoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Kolotinetsкак передаются параметры username, password для прокси?

кстати. не знаю. если найдешь - скинь. всегда общался
с проксями не тербующими авторизации.
...
Рейтинг: 0 / 0
работа с сокетом для Alexander Kolotinets
    #32603111
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему не хотите использовать классы URL и URLConnection? Иля я что-то не понимаю?
...
Рейтинг: 0 / 0
работа с сокетом для Alexander Kolotinets
    #32603130
Фотография А.Гpacoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenА почему не хотите использовать классы URL и URLConnection? Иля я что-то не понимаю?

ты кому вопрос говоришь? если мне -
меня привлекает более нативная работа,
т.е. через сокет :)
...
Рейтинг: 0 / 0
работа с сокетом для Alexander Kolotinets
    #32603536
Alexander Kolotinets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хочу использовать то, что более эффективно (менее трудоемко). Насчет URL & URLConnection - все-равно остается открытым вопрос по аутентификации на прокси :(
...
Рейтинг: 0 / 0
работа с сокетом для Alexander Kolotinets
    #32603707
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C Классами URL и URLConnection решить вашу проблему раз в 10-ть легче и быстрее, т.к. в них уже реализовано все то что написал А.Гpacoff.

Вот пример для прокси


Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
 
Соединение через прокси сервер 
 --------------------------------------------------------------------------------
 

java -DproxySet=true -DproxyHost=myProxyServer.come -DproxyPort= 80  MyJavaApp
Или :
import java.util.Properties;
...

Properties systemSettings = System.getProperties();
systemSettings.put("proxySet", "true");
systemSettings.put("proxyHost", "myProxyServer.com");
systemSettings.put("proxyPort", "80");
System.setProperties(systemSettings);

// jdk1. 3  or better, the names have changed eg.
// Properties systemSettings = System.getProperties();
// systemSettings.put("http.proxyHost","myProxyServer.com") ;
// systemSettings.put("http.proxyPort",  80 ) ;
Аутентификация :
Properties systemSettings = System.getProperties();
...
System.setProperties(systemSettings);

URL url=new URL("http://someserver/somepage");
URLConnection uc = url.openConnection ();
String encoded = new String(Base64.base64Encode(new String("username:password").getBytes()));
uc.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
uc.connect();


user_pref("security.lower_java_network_security_by_trusting_proxies"), true);
  Properties propSystem = System.getProperties();
  // Sun VM
  propSystem.put("proxySet", "true");
  propSystem.put("proxyHost", "myProxyServer.com");
  propSystem.put("proxyPort", "80");

  // Microsoft VM
  propSystem.put("firewallSet", "true");
  propSystem.put("firewallHost", "myProxyServer.com");
  propSystem.put("firewallPort", "80");
  propSystem.put("http.proxyHost", "myProxyServer.com");
  propSystem.put("http.proxyPort", "80");

 
...
Рейтинг: 0 / 0
работа с сокетом для Alexander Kolotinets
    #32603771
Фотография А.Гpacoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenC Классами URL и URLConnection решить вашу проблему раз в 10-ть легче и быстрее, т.к. в них уже реализовано все то что написал А.Гpacoff.

кстати, тема заглавного поста - про работу через сокет :)
...
Рейтинг: 0 / 0
работа с сокетом для Alexander Kolotinets
    #32603796
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Гpacoff wessenC Классами URL и URLConnection решить вашу проблему раз в 10-ть легче и быстрее, т.к. в них уже реализовано все то что написал А.Гpacoff.

кстати, тема заглавного поста - про работу через сокет :)

Я думаю ты не сильно обиделся. :)
...
Рейтинг: 0 / 0
работа с сокетом для Alexander Kolotinets
    #32603887
Фотография А.Гpacoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen А.Гpacoff wessenC Классами URL и URLConnection решить вашу проблему раз в 10-ть легче и быстрее, т.к. в них уже реализовано все то что написал А.Гpacoff.

кстати, тема заглавного поста - про работу через сокет :)

Я думаю ты не сильно обиделся. :)

да вообще никак :)
...
Рейтинг: 0 / 0
работа с сокетом для Alexander Kolotinets
    #32604627
Alexander Kolotinets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenC Классами URL и URLConnection решить вашу проблему раз в 10-ть легче и быстрее, т.к. в них уже реализовано все то что написал А.Гpacoff.

Вот пример для прокси


Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
 
Соединение через прокси сервер 
 --------------------------------------------------------------------------------
 


java -DproxySet=true -DproxyHost=myProxyServer.come -DproxyPort= 80  MyJavaApp
Или :
import java.util.Properties;
...

Properties systemSettings = System.getProperties();
systemSettings.put("proxySet", "true");
systemSettings.put("proxyHost", "myProxyServer.com");
systemSettings.put("proxyPort", "80");
System.setProperties(systemSettings);

// jdk1. 3  or better, the names have changed eg.
// Properties systemSettings = System.getProperties();
// systemSettings.put("http.proxyHost","myProxyServer.com") ;
// systemSettings.put("http.proxyPort",  80 ) ;
Аутентификация :
Properties systemSettings = System.getProperties();
...
System.setProperties(systemSettings);

URL url=new URL("http://someserver/somepage");
URLConnection uc = url.openConnection ();
String encoded = new String(Base64.base64Encode(new String("username:password").getBytes()));
uc.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
uc.connect();


user_pref("security.lower_java_network_security_by_trusting_proxies"), true);
  Properties propSystem = System.getProperties();
  // Sun VM
  propSystem.put("proxySet", "true");
  propSystem.put("proxyHost", "myProxyServer.com");
  propSystem.put("proxyPort", "80");

  // Microsoft VM
  propSystem.put("firewallSet", "true");
  propSystem.put("firewallHost", "myProxyServer.com");
  propSystem.put("firewallPort", "80");
  propSystem.put("http.proxyHost", "myProxyServer.com");
  propSystem.put("http.proxyPort", "80");

 


Спасибо за столь подробное описаниеб респект

Попробовал осуществить данную реализацию :

public void GetConnection() throws IOException {
Properties systemSettings = System.getProperties();
systemSettings.put("proxySet", "true");
systemSettings.put("proxyHost", "192.168.29.112");
systemSettings.put("proxyPort", "3128");
System.setProperties(systemSettings);


URL url;
url = new URL("http://www.sql.ru");
URLConnection myuc = url.openConnection ();
String encoded = new String(Base64.encode(new String("my_iser:my_password").getBytes()));
myuc.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
//myuc.setRequestProperty("Proxy-Authorization", "Basic " + "spirit:systemsys");
myuc.connect();

System.out.println(myuc.getContentLength());


}

В результате exception:
Exception in thread "main" java.lang.IllegalArgumentException: Illegal character(s) in message header value: Basic c3Bpcml0OnN5c3RlbXN5cw==

at sun.net.www.protocol.http.HttpURLConnection.checkMessageHeader(HttpURLConnection.java:237)
at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:1843)

В связи с этим вопрос - Base64 - это что за класс? Мне Idea подсказала: import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / работа с сокетом для Alexander Kolotinets
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]