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

приведенный метод возвращает строку (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
13.07.2004, 16:46
    #32602289
Alexander Kolotinets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с сокетом для 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
13.07.2004, 16:53
    #32602313
А.Гpacoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с сокетом для Alexander Kolotinets
Alexander Kolotinetsбольшое спасибо за содержательный пример, респект.
А что передается в качестве httpPath и как передаются параметры username, password для прокси?

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

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

ты кому вопрос говоришь? если мне -
меня привлекает более нативная работа,
т.е. через сокет :)
...
Рейтинг: 0 / 0
14.07.2004, 12:26
    #32603536
Alexander Kolotinets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с сокетом для Alexander Kolotinets
Я хочу использовать то, что более эффективно (менее трудоемко). Насчет URL & URLConnection - все-равно остается открытым вопрос по аутентификации на прокси :(
...
Рейтинг: 0 / 0
14.07.2004, 13:24
    #32603707
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с сокетом для Alexander Kolotinets
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
14.07.2004, 13:41
    #32603771
А.Гpacoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с сокетом для Alexander Kolotinets
wessenC Классами URL и URLConnection решить вашу проблему раз в 10-ть легче и быстрее, т.к. в них уже реализовано все то что написал А.Гpacoff.

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

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

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

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

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

да вообще никак :)
...
Рейтинг: 0 / 0
14.07.2004, 17:41
    #32604627
Alexander Kolotinets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с сокетом для 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
Форумы / Java [игнор отключен] [закрыт для гостей] / работа с сокетом для Alexander Kolotinets / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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