Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Прокси сервер на JAVA, ПРОБЛЕМЫ?


Автор: Chel 17.8.2006, 15:35
У меня есть какой то процент, вероятность сбоя.
Я генерирую число, беру его и проверяю его с
моим процентом. Если число больше процента то 
у меня в браузере выходит ошибка. 
Проблема моя:  smile 
Код
for(int i=0;i<n;i++)
{   
     int RN1 = RandomNumber1();
     int RN2 = RandomNumber2();
     client = ss.accept();
     connection cc = new connection(client,i,host,remoteport,RandomNumberGeneration,per,per3,ss,RN1,RN2);
}

у меня несколько случайных чисел, а как сделать чтобы
было только одно число для каждого клиента. То есть
если новый клиент соединяется то для него генерируется
новое число. а то я не могу выловить ошибку,но если ловлю то
ничего не происходит.
Только не говорите что нужно просто с цикла вынести
функцию где генерируется числа. smile 
Если что могу код скинуть, он простой, легко
понять. 
Люди помогите пожалуйста, срочно надо, гарью. smile 
Наверное смог объяснить, задачу smile 

Заранее спасобо, ВСЕМ..... smile  smile  smile 

Автор: LSD 17.8.2006, 15:42
Ничего не понятно. Выкладывай код.

Автор: Chel 17.8.2006, 15:49
Код

import java.awt.*;
import java.awt.List;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.Timer;
import java.lang.*;
import javax.swing.*;

public class server extends Panel
{
    //function which generate the random number between a(min) and b(max)
    public static int RNG(int a,int b){
        int k;
        boolean error1 = false;
        //we check. if our max will be smaller than min or equal then we have error
        //our return value will be negative or 0 and in the main function our programm
        //will not work...
        if(a<=b){
            
            System.err.println("Your max must be bigger min...");
            error1 = true;
            return a-b;    
        }
        else{
        //if max is bigger then min it will be work and generate random number.    
            k = (int) ((a-b)*Math.random()+b);
            
            //or we can write like this. it is similar with code which is written above    
            
            //Random random = new Random();
            //k = random.nextInt(a-b) + b;
            
            return k;
        }
        
    }

    public static int RandomNumber1(){
        int r;
        //random numbers
        Random random = new Random();
        r = random.nextInt(100);
        System.out.println("RandomNumber1:"+r);
        return r;
        }
    public static int RandomNumber2(){
        int r1;
        //random numbers
        Random random = new Random();
        r1 = (int) (100*Math.random());
        System.out.println("RandomNumber2:"+r1);
        return r1;
    }
    public static void main(String args[])throws Exception 
    {
        
        
        // Create a socket object from the ServerSocket to listen and accept 
        // connections.
        try 
        {        
                Socket client = null;
                int n = 100;
                int NUM_OF_INTEGERS = 1000;
                //read and then buffered from file...
                FileReader file = new FileReader("in.txt");
                BufferedReader fileInput = new BufferedReader(file);
         
                //we construct the array, which can inckude 1000 int
                ArrayList nums = new ArrayList(NUM_OF_INTEGERS);
                
                String line = null;
                while ((line = fileInput.readLine()) != null) {
                    nums.add(line);
                }
                // Close file
                fileInput.close();
                // construct an array of strings
                String[] numbers = new String[nums.size()];
                // populate that array
                nums.toArray(numbers);
                
                //we save all everything from file to some string variables
                //each line in the file have own value
                 
                String remoteport1 = numbers[0]; //first line in in.txt is remoteport
                String localport1 = numbers[1];  //second line in in.txt is localport
                String host = numbers[2];        //third line in in.txt is host
                String min1 = numbers[3];        //fourth line in in.txt is minimum number
                String max1 = numbers[4];        //fifth line in in.txt is maximum number
                String per1 = numbers[5];        //sixth line in in.txt is percentage of disconnecting
                String per2 = numbers[6];        //sixth line in in.txt is percentage of disconnecting
                
                //we change from String to Integer some variables which must be Integer
                int remoteport = Integer.parseInt(remoteport1);
                int localport = Integer.parseInt(localport1);
                int min = Integer.parseInt(min1);
                int max = Integer.parseInt(max1);
                int per = Integer.parseInt(per1);
                int per3 = Integer.parseInt(per2);
                boolean error = false;
                 
            //function which generate random number
            int RandomNumberGeneration = RNG(max,min); 
            
            if( localport <= 0 || host==null || remoteport <= 0 || RandomNumberGeneration<0)
              {
                  System.err.println("Error: Invalid Specification ");
               System.err.print("Port value out of range (negative or null)");
               System.err.println("or maximum number smaller then minimum");
                  error = true;
              }    
              else {
            System.out.println("Starting proxy for " + host + ":" + remoteport + " on port " + localport);}
            
            System.out.println("Time delay is (random number) :" + RandomNumberGeneration);
            
            ServerSocket ss = new ServerSocket(localport);
                //connection with proxy server    
                
            for(int i=0;i<n;i++)
                {   
                    int RN1 = RandomNumber1();
                    int RN2 = RandomNumber2();
                    client = ss.accept();
                    //go to connection function
                    connection cc = new connection(client,i,host,remoteport,RandomNumberGeneration,per,per3,ss,RN1,RN2);
                }            
        }
        catch (Exception e) 
        {
            
            System.err.println(e);
        }
    }
}

class connection extends Thread 
{
    Socket client=null;
    int id;
    String host;
    int remoteport;
    long ranum;
    long max;
    int percentage;
    int percentage1;
    ServerSocket ss;
    int RandomNumber1;
    int RandomNumber2;
    
    public connection(Socket s,int i, String h, int port , long a ,int per,int per1, ServerSocket o, int r, int r1) 
    { 
        id=i;
        client=s;
        host=h;
        remoteport=port;
        ranum=a;
        percentage=per;
        percentage1=per1;
        ss=o;
        RandomNumber1=r;
        RandomNumber2=r1;
        this.start(); 
    }
    
    
    public void run()
    {
        final byte[] request = new byte[1024];
        byte[] reply = new byte[4096];
        int i=0;
        
        boolean error = false;
        final int ADP = 100-percentage;
        final int ADP1 = 100-percentage1;
        System.out.println("ID:"+id);
        Socket server = null;
        try 
        {
            
            final InputStream streamFromclient = client.getInputStream();
            final OutputStream streamToclient= client.getOutputStream();
            
            if(RandomNumber1>ADP){
                streamFromclient.close();
                streamToclient.close();
                System.err.println("Error: transformation canceled");
            }
            else{
            try 
            {
                server = new Socket(host, remoteport); 
            } 
            catch (IOException e) 
            {
                PrintWriter out = new PrintWriter(new OutputStreamWriter(streamToclient));
                out.println("Proxy server cannot connect to " + host + ":" + remoteport + ":\n" + e);
                out.flush();
                client.close();
            }
            
            final InputStream streamFromserver = server.getInputStream();
            final OutputStream streamToserver = server.getOutputStream();
            
            
            TimerTask timerTask = new TimerTask()
            {
                public void run() 
                {
                    int bytes_read;
                    
                    try 
                    {
                        while((bytes_read = streamFromclient.read(request)) != -1) 
                        {
                            //request
                            streamToserver.write(request, 0, bytes_read);
                            streamToserver.flush();
                        }
                    }
                    catch (IOException e) {}
                    try {streamToserver.close();} catch (IOException e) {}
                }
            };
            Timer timer = new Timer();
            timer.schedule( timerTask, ranum );
            
            if(RandomNumber2>ADP1){
             streamToclient.close();
             streamFromclient.close();
             System.err.println("Error: Transformation canceled");
             
            }
            else{
             int bytes_read;
                 try 
                 {                
                         while((bytes_read = streamFromserver.read(reply)) != -1) 
                         {
                             //response
                             streamToclient.write(reply, 0, bytes_read);
                             streamToclient.flush();
                         }        
                 }        
            
                 catch(IOException e) {}
                 streamToclient.close();
                 }
            }
        }
        
        catch (IOException e) { System.err.println(e); }
        finally 
        { 
            try 
            { 
                if (server != null) 
                    server.close(); 
                if (client != null) 
                    client.close(); 
            }
            catch(IOException e) {}
        }
      
    }
}


Добавлено @ 15:50 
Помогите пожалуйста

Автор: Chel 17.8.2006, 18:20
Люди добрые помогите плз.  smile 

Автор: powerOn 17.8.2006, 21:59
Chel, 
1) Кто, куда, как и зачем коннектится?
2) Какой обмен информацией при этом происходит между сервером и клиентом?
3) Жизненный цикл системы этой в чем заключается?

Подробнее, пожалуйста... 


Автор: Chel 18.8.2006, 10:06
1.В начале прокси ишет клиента, находит и коннектитса. n-это id-ник соединения. n=100.
Код
for(int i=0;i<n;i++)
{   
    int RN1 = RandomNumber1();
    int RN2 = RandomNumber2();
    client = ss.accept();
    //go to connection function
    connection cc = new connection(client,i,host,remoteport,RandomNumberGeneration,per,per3,ss,RN1,RN2);
}

Клиент передаёт инфо прокси прокси ищет Remoteprot, находит делает соединение
и передаёт инфо удалённому серваку. и тот обратно клиенту.

connection with server
Код
try 
{
    server = new Socket(host, remoteport); 
} 
catch (IOException e) 
{
    PrintWriter out = new PrintWriter(new OutputStreamWriter(streamToclient));
    out.println("Proxy server cannot connect to " + host + ":" + remoteport + ":\n" + e);
    out.flush();
    client.close();
}

client-proxy-server
Код
while((bytes_read = streamFromclient.read(request)) != -1) 
{
    //request
    streamToserver.write(request, 0, bytes_read);
    streamToserver.flush();
}

Server-proxy-Client
Код
while((bytes_read = streamFromserver.read(reply)) != -1) 
{
    //response
    streamToclient.write(reply, 0, bytes_read);
    streamToclient.flush();
}
  

2. клиент у нас веб браузер.  HTTP

3.если есть коннектион значит работает если нету не.
Мне его не надо выключать, просто если типа А>Б
значит не работает и в окне не чего нету. А
в следуюший раз если А>Б не выполняется то все дальше
работает опять до А>Б

Наверное объяснил. ПОМОГИТЕ. а то я всё перепробовал.  smile 
Не идёт. smile 

Автор: Chel 18.8.2006, 12:37
Люди добрые и умные подскажите хотя бы как сделать, чтоб
когда клиент передавал инфо, у меня для этой передачи
генерировалось только одно число, а не несколько. Как у 
меня.  smile 
Например:
Когда я захожу на сайта www.vingrad.ru: одно число
Когда я захожу на сайта www.forum.vingrad.ru: другое, но одно...
.
.
.
.
.
..........................и т.д smile  smile  smile 

Автор: LSD 18.8.2006, 14:32
Т.е. тебе надо для одного и того же узла получать одино и тот же число?
Если да, то делай так: inetAddress.getHostName().hashCode().

Автор: Chel 18.8.2006, 14:59
Вы меня не так поняли, у меня хост,локалпорт,ремотпрот это всё есть
мне надо с генерировать число, только одно и проверить с другим числом
(Процент не соединения). Типа вот такого:

Цитата

if(RandomNumber1>ADP){
                //error
            }
            else{
            //eto vse rabotaet
            {


Рандом числа я передаю здесь
Цитата

for(int i=0;i<n;i++)
                {   
                    int RN1 = RandomNumber1();
                    int RN2 = RandomNumber2();
                    client = ss.accept();
                    //go to connection function
                    connection cc = new connection(client,i,host,remoteport,RandomNumberGeneration,per,per3,ss,RN1,RN2);
                }            

Но тут у меня проблема, у меня несколько чисел, а мне надо 
для каждого клиента одно число. Чтоб проверить его здесь: 1 Цитате.
он ошибку находит, но работает дальше   smile 

а задача у меня: у меня есть 2%(процент не соединения).
(1)когда я передаю информацию от клиента серверу у меня должна
выходить ошибка, то есть не чего не показывать в браузере,
когда информация поступает в прокси сервер от клиента,
(2) и  когда это же информация поступает уже с прокси к клиент.
в (1) у меня например 9%, а в (2) 0. или на оборот. Короче одно
из них должно быть 0.  smile 

Автор: Chel 19.8.2006, 12:27
нет у нас например есть браузер, когда мы например идём
на какой-нибудь сайт то в это время генерируется число 
для этого сайта, если идём после этого на другой то
генерируется другое число....и т.д. Вот что мне нужно
всё перепробовал. Помогите ПЛЗ.  smile 

Автор: powerOn 19.8.2006, 14:19
Можно попробовать так: взять хеш от результата конкатенации строковых представлений IP адресов клиента и сервера. 
И случайно и уникально.

Автор: Chel 19.8.2006, 18:41
Цитата

Можно попробовать так: взять хеш от результата конкатенации строковых представлений IP адресов клиента и сервера. 
И случайно и уникально.


А не могли бы вы написать это простыми словами, а то
я что та не догоняю или показать кодам. Спасибо большое.

Автор: Chel 19.8.2006, 20:13
Люди кто нибудь знает как сделать, чтоб моя разпознавал
что я перехожу на другой адрес. Типа если меняется урл???
ПЛЗ помогите?  smile 

Автор: powerOn 19.8.2006, 20:20
Насколько я понял, для каждого соединения клиента с сервером Вам необходимо получить некоторое уникальное и в тоже время случайное число. Для этого:
1) Каким-то образом получаем IP адрес клиента и переводим его в строку.
2) Каким-то образом получаем IP адрес сервера и переводим его в строку.
3) Складываем полученный строки.
4) Берем хеш от полученной строки.

Код

String serverIP = getServerIP().toString();
String clientIP = getClientIP().toString();
String str = serverIP + clientIP;
int random_digit = str.hashCode();

Автор: Chel 19.8.2006, 21:56
2 MoonCat: Что та не получается?

Автор: powerOn 20.8.2006, 13:46
Цитата(Chel @  19.8.2006,  22:56 Найти цитируемый пост)
2 MoonCat: Что та не получается? 

Всмысле вообще идея такая не годится? Или её реализовать не получается? 

Автор: Chel 20.8.2006, 13:49
2 MoonCat: реализовать не получается,  да и там по моему число большое получается, а мне надо от 0 до 100
в этом промежутке. Потому что я буду потом проверять это число...

Автор: powerOn 20.8.2006, 14:09
Цитата(Chel @  20.8.2006,  14:49 Найти цитируемый пост)
реализовать не получается, 

IP адреса клиента и сервера для какого-либо соединения не возможно получить? 

Цитата(Chel @  20.8.2006,  14:49 Найти цитируемый пост)
а мне надо от 0 до 100 в этом промежутке.

Так переведите число во float, поделите его на Integer.MAX_VALUE и умножте на 100. Тогда число сотню не привысит никогда.

Код

int real_code = (int) ((((double) s ) / Integer.MAX_VALUE)  * 100);


Автор: Chel 20.8.2006, 14:20
2 MoonCat:  

не могли бы вы мне написать функцию getServerIP(), getClientIP().
в учебниках смотрел так и не нашёл, я просто чайник
ещё в Java Network Programming.  Thanks.

Автор: powerOn 20.8.2006, 14:37
Цитата(Chel @  20.8.2006,  15:20 Найти цитируемый пост)
не могли бы вы мне написать функцию getServerIP(), getClientIP().


Это не в учебниках смотреть надо, а в собственной головушке...  smile 
 smile  У Вас же прокси сервер? А это промежуточное звено между каким-то клиентом и каким-то сервером. Вы каким образом соединение обеспечиваете между ними, если не знаете кто куда коннектится?? Как тогда вообще ваш прокси сервер работает?

PS: Вообще все адреса через сокеты получить можно.

Автор: Chel 20.8.2006, 15:23
Спосибо большое, попробую

Автор: Chel 20.8.2006, 16:35
Цитата

GET / HTTP/1.1
host: www.google.com
.........................
.........................


Мне нужен вот этот хост: www.google.com если мы переходим на www.mail.ru, то хост www.mail.ru.
а по вашему я IP-ник компа клиента достаю.
Он работает, но мне нужно вытащить адрес
страницы на которую я перешёл.  
Чтоб при каждом запросе он у меня генерировал разные числа.
В этом случае у нас меняется адрес страницы, а не IP-ник.
Как я понял...  smile 

Автор: powerOn 20.8.2006, 17:56
Цитата(Chel @  20.8.2006,  17:35 Найти цитируемый пост)
Мне нужен вот этот хост: www.google.com если мы переходим на www.mail.ru, то хост www.mail.ru.
а по вашему я IP-ник компа клиента достаю.
Он работает, но мне нужно вытащить адрес
страницы на которую я перешёл.  
Чтоб при каждом запросе он у меня генерировал разные числа.
В этом случае у нас меняется адрес страницы, а не IP-ник.
Как я понял...  smile  


ну так возмите и сложите строку-адрес-страницы и строку-IP-клиента. По результату возьмите хеш.

Автор: Chel 20.8.2006, 20:33
строку-адрес-страницы: вот я и её не могу вытащить, вытаскивает 
IP-ник компа, а не строка-адрес-страницы. Не подскажите какой
функцией вытаскивается строка-адрес-страницы? ПЛЗ.  smile 

Автор: powerOn 21.8.2006, 10:04
Цитата(Chel @  20.8.2006,  21:33 Найти цитируемый пост)
Не подскажите какой
функцией вытаскивается строка-адрес-страницы?


Ну конечно же не подскажу. Я не телепат, и понятия не имею как работает Ваш прокси сервер.  Это Вам должно быть лучше известно, чем мне.  smile  Из заросов клиентов как-то вытаскивайте эту строку...

Автор: Chel 21.8.2006, 10:08
Понял, мне надо вытащить строку из за запроса, а потом хэш  smile

Добавлено @ 10:09 
то есть строку типа host : www.vingrad.ru

Автор: Chel 21.8.2006, 10:47
Как я понил мне надо с InputStream-a  вытащить строку host: www.vingrad.ru , и сделать хэш  smile 

Автор: Chel 21.8.2006, 16:16
Не получается?  smile  smile  smile  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)