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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прокси сервер, Создание прокси сервера 
:(
    Опции темы
NetLord
Дата 20.6.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 25.2.2005

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



Здравствуйте!

Пытаюсь создать свой http прокси сервер. 
Что то создал но работает как то криво моментами.
Кажется проблема в том как устанавливаются заголовки ответа.
Когда я использую конструкцию new OutputStreamWriter(conn.getOutputStream())
она возвращает только тело ответа.
В связи с этим вопрос можно ли в HttpURLConnection получить входящий поток с сервера в который 
включены сразу заголовки вместе с телом ответа.


Для ясности привожу код который использую
Класс слушающий порт
Код

package proxy;




import java.io.*;

import java.net.*;




public class Listener {

/** Creates a new instance of TestURLCon */
public Listener() {
    createSocket();
}

public static void main(String[] args) {
new Listener();

}
public void createSocket(){
    System.out.println("Listener started on 2000");
        ServerSocket serverSocket = null;
        boolean listening = true;
        try {
            serverSocket = new ServerSocket(2000);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 2000.");
            System.exit(-1);
        }
        try{
        while (listening)
        new proxy.Proxier(serverSocket.accept()).start();
        serverSocket.close();        
        }
catch(Exception e){e.printStackTrace();}        
}

}



и класс обрабатывающий запросы-ответы
Код

package proxy;

import java.io.*;
import java.net.*;
import java.util.*;


public class Proxier extends Thread {
    Socket socket;
    
    public Proxier(Socket socket){
        this.socket=socket;
        
    } 
    public void run(){run2();}
    public void run2(){
        
        InputStreamReader in;
        OutputStream out;
        OutputStreamWriter outserver; 
        BufferedInputStream bf;
        String request="";
        try{
             in = new InputStreamReader(socket
                    .getInputStream());
            out=socket.getOutputStream();
        int b=0;
        int lastB=0;
        //вытаскиваем url для запроса**************
        String sb=new String();                
        boolean is=true;
        this.sleep(50);
        while(in.ready()&((char)b!='\n')) {            
            b=in.read();
            sb=sb+(char)b;
            
            } 
        //получаю тип запроса POST или GET        
        int i=sb.indexOf(" ");        
        String type=sb.substring(0,i);
        request=sb.substring(i+1);        
        i=request.indexOf(" ");            
        request=request.substring(0,i);
        
        URL server=new URL(request);
        Properties systemProperties = System.getProperties();
        systemProperties.setProperty("http.proxyHost","proxy");
        systemProperties.setProperty("http.proxyPort","8080");
        HttpURLConnection conn = (HttpURLConnection) server.openConnection();
        conn.setDoInput(true);
        
        
        int j,k;
        //считываю и устанавливаю заголовки запроса
        while(is&in.ready()){
            sb="";
            do{
                b=in.read();
                sb=sb+(char)b;
            }
            while((char)b!='\n');
            i = sb.indexOf("\r\n");                        
            if(i==0){
                is=false;
            }else{
            j=sb.indexOf(":");
            conn.setRequestProperty((sb.substring(0,j)).trim(),(sb.substring(j+1,i)).trim());
            
            }
        }
        
        //устанавливаю соединение исходя из типа запроса
        if(type.equals("GET")){
            conn.setDoOutput(false);
            //System.out.println(request+"  GET");
            conn.connect();
            
        }
        if(type.equals("POST")) {
            conn.setDoOutput(true);            
            outserver = new OutputStreamWriter(conn.getOutputStream());            
                while(in.ready()){
                b=in.read();
                
                outserver.write(b);                
            }
                outserver.flush();
                outserver.close();//
        }
        
        
            
        //проверяю статус ответа сервера
        try{bf=new BufferedInputStream(conn.getInputStream(),200);}
        catch(Exception e){
            bf=new BufferedInputStream(conn.getErrorStream());
        }
        /*if(conn.getResponseCode()  != HttpURLConnection.HTTP_OK){
            
            //System.err.println("HTTP ERROR " + conn.getResponseCode());
            //System.err.println(conn.getResponseMessage());
            bf=new BufferedInputStream(conn.getErrorStream());
            
            
          // 
          }else
        {bf=new BufferedInputStream(conn.getInputStream(),200);}*/
        //BufferedInputStream bf=new BufferedInputStream(    serversocket.getInputStream(),200);
        
        //System.out.println(conn.getHeaderField(0));
        //устанавливаю статус и заголовки ответа
        out.write((conn.getHeaderField(0)+"\r\n").getBytes());
        Map m=conn.getHeaderFields();
        for(int l=1;l<m.size();l++)
        {
        //System.out.println(conn.getHeaderFieldKey(l)+": "+conn.getHeaderField(l));
        out.write((conn.getHeaderFieldKey(l).trim()+": "+conn.getHeaderField(l).trim()+"\r\n").getBytes());}
        //System.out.println("\r\n");
        
        out.write(("\r\n").getBytes());
        //перенаправляю тело ответа 
        while((b=bf.read())!=-1){            
        //System.out.print((char)b);
        out.write(b);
        }
        out.flush();
        in.close();        
        bf.close();
        out.close();
        conn.disconnect();        
        }
        catch(Exception e){
            System.err.println("Error  " + request);
            e.printStackTrace();
            try{        
            }
            catch(Exception ex){}
        }
        
    }
    

}




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

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

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


 




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


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

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