Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NIO + Proxy, Как использовать NIO через прокси 
:(
    Опции темы
KOp4iK
Дата 7.11.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 26.11.2004
Где: Латвия

Репутация: нет
Всего: 3



Доброго всем дня!

Есть NIO при прямом (direct connection) 
Код

        channel = SocketChannel.open(new InetSocketAddress(m_host, m_port));
        channel.configureBlocking(false);
        selector = Selector.open();
        channel.register(selector, SelectionKey.OP_READ);

работает...
Есть пример скачки файлов через прокси
Код

            Authenticator.setDefault(new MyAuthenticator("login", "qwerty"));

            URL url = new URL("http://www.aaa.com");

            SocketAddress address = new InetSocketAddress("192.168.1.12", 8080);
            Proxy proxy = new Proxy(Proxy.Type.HTTP, address);

            URLConnection c = url.openConnection(proxy);

            InputStream is = c.getInputStream();

            byte[] buffer = new byte[1024];
            int numRead;
            long numWritten = 0;
            while ((numRead = is.read(buffer)) != -1) {
                System.out.write(buffer, 0, numRead);
                numWritten += numRead;
            }

Внимание вопрос а можно ли сделать NIO через прокси... ну или хотяб куда копать smile 

Зарании спб!
PM MAIL   Вверх
COVD
Дата 7.11.2006, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



у вас в первом примере tcp/ip , во втором - http. А nio оперирует с tcp сокетами. Прикрутить nio для обслуживания http потребует отказа от стандартного URLConnection и программирования обмена по http вручную. 

Вот этот господин (http://weblogs.java.net/blog/jfarcand/) взялся за благородную задачу прикрутить nio к томкату и сделать асинхронный вебсервер. 
PM MAIL   Вверх
KOp4iK
Дата 8.11.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 26.11.2004
Где: Латвия

Репутация: нет
Всего: 3



ну на самом деле я имел в виду что-то типа
Код

            channel = SocketChannel.open(new InetSocketAddress(m_proxyHost, m_proxyPort));

            in = channel.socket().getInputStream();
            out = channel.socket().getOutputStream();

            BufferedReader rd = new BufferedReader(new InputStreamReader(in));

            final PrintStream wr = new PrintStream(out);

            wr.print("CONNECT " + m_host + ':' + m_port + " HTTP/1.1\r\n");
            wr.print("Host: " + m_host + ':' + m_port + "\r\n");

            if (m_username != null && m_password != null) {
                wr.print("Authorization: Basic " + toBase64(m_username + ':' + m_password) + "\r\n");
                wr.print("Proxy-Authorization: Basic " + toBase64(m_username + ':' + m_password) + "\r\n");
            }

            wr.print("\r\n");
            wr.flush();

            String line = rd.readLine();

            if (line == null)
                throw new IOException("Proxy closed connection");

            if (!line.matches("HTTP/1\\.\\d\\s+200.*"))
                throw new IOException("Cannot CONNECT, Proxy returned " + line);

            channel.configureBlocking(false);
            selector = Selector.open();
            channel.register(selector, SelectionKey.OP_READ);

В результате мы имеем SocketChannel и Selector  с которыми НИО работает безпроблем
Но это через HTTP осталось аналогичное с SOCKS v5 замутить
PM MAIL   Вверх
KOp4iK
Дата 13.11.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 26.11.2004
Где: Латвия

Репутация: нет
Всего: 3



В общем в результате навыял два кода.
Для HTTPS
Код

        // connect to HTTP proxy
        channel = SocketChannel.open(new InetSocketAddress(m_proxyHost, m_proxyPort));

        in = channel.socket().getInputStream();
        out = channel.socket().getOutputStream();

        BufferedReader rd = new BufferedReader(new InputStreamReader(in));

        final PrintStream wr = new PrintStream(out);

        wr.print("CONNECT " + m_host + ':' + m_port + " HTTP/1.1\r\n");
        wr.print("Host: " + m_host + ':' + m_port + "\r\n");

        if (m_username != null && m_password != null) {
            wr.print("Authorization: Basic " + toBase64(m_username + ':' + m_password) + "\r\n");
            wr.print("Proxy-Authorization: Basic " + toBase64(m_username + ':' + m_password) + "\r\n");
        }

        wr.print("\r\n");
        wr.flush();

        String line = rd.readLine();

        if (line == null)
            throw new IOException("Proxy closed connection");

        if (!line.matches("HTTP/1\\.\\d\\s+200.*"))
            throw new IOException("Cannot CONNECT, Proxy returned " + line);

        channel.configureBlocking(false);
        selector = Selector.open();
        channel.register(selector, SelectionKey.OP_READ);

и для SOCKS v5
Код

        boolean isAutentificationNeeded = false;
        if (m_username != null && m_password != null) {
            isAutentificationNeeded = true;
        }

        channel = SocketChannel.open(new InetSocketAddress(m_proxyHost, m_proxyPort));

        out = channel.socket().getOutputStream();
        in = channel.socket().getInputStream();

        final DataOutputStream dos = new DataOutputStream(out);
        final BufferedInputStream din = new BufferedInputStream(in);

        //   ----------------------------   SENDING GREETINGS   ----------------------------------------------------
        byte[] greeting = new byte[]{
                                                           /*  INFORMATION FROM http://en.wikipedia.org/wiki/SOCKS */
                5,      // socks version number, must be 0x05 for this version
                1,      // number of authentication methods supported
                (isAutentificationNeeded)
                        ? (byte) 2      // Username/Password
                        : (byte) 0      // No authentication
        };

        dos.write(greeting);
        //   ----------------------------   PARSING GREETINGS REQUEST  ------------------------------------------------
        int serverVersion = din.read();
        if (serverVersion != 5) throw new InnerIOException("SOCKS5 protocol error: version: " + serverVersion);
        int authMethod = din.read();
        if (authMethod == 255) throw new InnerIOException("SOCKS5 authentication failure: no supported method acccepted by server");

        int tmp;

        //   ----------------------------   SENDING LOGIN PASSWORD IF NEEDED  -------------------------------------------
        if (authMethod == 2) {
            dos.writeByte(1);
            String uname = m_username;
            byte[] unamebytes = (uname == null) ? new byte[]{} : uname.getBytes();
            dos.writeByte(unamebytes.length);

            dos.write(unamebytes);
            String pwd = null;
            if (m_password != null) {
                pwd = m_password;
            }
            byte[] pwdbytes = (pwd == null) ? new byte[]{} : pwd.getBytes();
            dos.writeByte(pwdbytes.length);
            dos.write(pwdbytes);
            tmp = din.read();
            if (tmp != 1) throw new IOException("socks5.auth.error." + tmp);
            tmp = din.read();
            if (tmp != 0) throw new IOException("socks5.auth.error." + tmp);
        }

        //   ----------------------------   SENDING CONNECT REQUEST  -------------------------------------------

        byte[] request = new byte[]{
                                                          /*  INFORMATION FROM http://en.wikipedia.org/wiki/SOCKS */
                5,                        // socks version number, must be 0x05 for this version
                1,                        // command code establish a tcp/ip stream connection
                0,                        // reserved, must be 0x00
                3,                        // Domain name (address field is variable)
                (byte) m_host.length()    // destination address, 4/16 bytes or 1+domain name length.
        };

        // sending request
        dos.write(request);
        dos.writeBytes(m_host);
        dos.writeShort(m_port);         // network byte order port number, 2 bytes

        serverVersion = din.read();
        if (serverVersion != 5) throw new IOException("SOCKS5 protocol error: version: " + serverVersion);
        tmp = din.read();
        if (tmp != 0) {
            switch (tmp) {
                case 1: throw new InnerIOException("SOCKS5 protocol error: general SOCKS server failure");
                case 2: throw new InnerIOException("SOCKS5 protocol error: connection not allowed by ruleset");
                case 3: throw new InnerIOException("SOCKS5 protocol error: Network unreachable");
                case 4: throw new InnerIOException("SOCKS5 protocol error: Host unreachable");
                case 5: throw new InnerIOException("SOCKS5 protocol error: Connection refused");
                case 6: throw new InnerIOException("SOCKS5 protocol error: TTL expired");
                case 7: throw new InnerIOException("SOCKS5 protocol error: Command not supported");
                case 8: throw new InnerIOException("SOCKS5 protocol error: Address type not supported");
                    default:
                        throw new IOException("SOCKS5 protocol error: unassigned");
            }
        }
        tmp = din.read();             //   read reserved byte
        if (tmp != 0) {
            throw new InnerIOException("SOCKS5 protocol error: reserved 3rd byte");
        }
        int addrType = din.read();              // read address type
        int addrLength = 0;
        switch (addrType) {
            case 1 : addrLength = 4;
                break;
            case 3 : addrLength = 0;
                break;
            case 4 : addrLength = 16;
                break;
            default:
                new InnerIOException("SOCKS5 protocol error: " + addrType);
        }
        if (addrType == 1 || addrType == 4) {
        } else {
            addrLength = din.read();
        }
        for (int i = 0; i < addrLength; i++) { // read address
            tmp = din.read();
        }

        tmp = din.read();   // finaly read port
        tmp = din.read();

        channel.configureBlocking(false);
        selector = Selector.open();
        channel.register(selector, SelectionKey.OP_READ);


Былобы очень интерестно услышеть ваши мнения по данным кусочкам. 
+ при HTTPS кака-то ISA возвращает что:
Код

java.io.IOException: Cannot CONNECT, Proxy returned HTTP/1.0 403 Forbidden

из строчки
Код

       if (!line.matches("HTTP/1\\.\\d\\s+200.*"))
            throw new IOException("Cannot CONNECT, Proxy returned " + line);

В общем как обычно плиз хелп!!! smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.