Я мультипряду: Лучший способ относиться к методу 'run ()'?

Хорошие, мне хотелось бы знать, как Вы сделали бы, чтобы относиться к методу run()на сервере TCP. Сервер этот:

public class Servidor{
    public static void main(String args[]) throws Exception{
        ServerSocket serv;
        SesionTCP session[] = new SesionTCP[100];

        int i=0;
        serv = new ServerSocket(8080);

        while(true){
            Socket s;
            s = serv.accept();
            session[i]=new SesionTCP(s);
            session[i].start();
            System.out.println("Nueva conexion entrante: "+serv);
            i++;
            if(i==100){
                i=0;
            }
            serv.close();
        }
    }
}

Как возможно наблюдать, instancio сеанс TCP внутри сервера, потом инициализировать ее посредством метода .start().

Хорошо, случай состоит в том, что я должен создавать class SesionTCP, какова должна делать серию вещей:

class SesionTCP extends Thread {
    Socket s;
    PrintWriter out;
    BufferedReader in;
    SesionTCP(Socket s) {
        this.s=s;
    } // fin constructor
    public void run(){
        try{
            in = new BufferedReader (new InputStreamReader(s.getInputStream()));
            out = new PrintWriter (new OutputStreamWriter(s.getOutputStream()));
        }catch(IOException e){ return; } // fin try-catch

        out.println("Mensaje del servidor");

        //LLamada a los diferentes métodos para tratar los mensajes
        int res;
        res=SesionTCP.helloserver();

        out.close();
        in.close();
        s.close();
    } // fin run
        public int helloserver(){
            String ip;
            String entrada;
            try{
                entrada=in.readLine();
                System.out.println(entrada+"he entrado en el hello");
                //Obtenemos la IP del cliente que invoca al servidor
                ip = s.getRemoteSocketAddress().toString();
            }catch(IOException e){
                System.out.println(e);
                return 0;
            }
            if (entrada.equals("HELLO "+ip)){
                return 1;
            }else{
                return 0;
            }
        }
    } // fin clase SesionTCP

Я объясняюсь, моя дилемма состоит из, что я хочу отнестись к сообщениям, что я получаю от клиента, как команды, и согласно команде, которую я получаю делать вещь или другую. Например, если клиент пишет команду начала "HELLO xxx.xxx.xxx.xxx" с Вашим ip, методом run() будь должен звонить в метод hello чтобы относиться к вышеупомянутому сообщению.

Все, что попробовало звонить в метод helloserver() он дает мне ошибку "нечетное число - static method helloserver () cannot be referenced from static context".

Каковым был бы лучший способ это осуществлять? Возможно делать, не звоня в методы, помещая все в run()? Или он остался бы очень грязным?

1
задан 28.12.2016, 19:31
0 ответов

Ты делаешь призыв к методу действительно со статического контекста, но это ошибка, назвав это не имеет ничего общего несмотря на то, что использует трэды ни метод run().

Измени линию:

res=SesionTCP.helloserver();

Из-за этой другой:

res = this.helloserver();

С другой стороны, и в край твоего preguna, я вижу, что в конце каждый run() ты закрываешь Socket. Обрати внимание, что ты используешь уникум socket для всех сеансы, что инстанции. Я предвижу, что первый трэд, который прибывает в линию s.close() (которого у него нет, почему быть первым, что ты загружаешь) закроет socket, и оставшаяся часть будут находить ограду и он даст тебе ошибку во время выполнения.

1
ответ дан 03.12.2019, 17:57
  • 1
    Действительно, ошибка была ahí во время это называть. Перед тем, как читать твой комментарий probé с res= helloserver(); просто, и tambié n compiló и даже probé и если metí в в mé все. ¿ Плохой этот способ это делать? –  28.12.2016, 20:25
  • 2
    Нет, это то же самое, но с this ты убеждаешься, что ты указываешь в среду este на объект. Это то же самое, что и ты делаешь с this.s = s, где у тебя есть, что ты отличаешься qué s está s говоря (признак объекта или pará метр) –  28.12.2016, 20:34
  • 3
    Стой, так как muchí пропасти спасибо на самом деле, я иду có mo 3 dí эксперт читая форумы в inglé в. до тех пор, пока я не увидел, что StackOverflow был tambié n в españ ol, и probé удача aquí. Проблема состояла, в чем глупой ошибки, có mo - это называть mé совсем таким образом, он произошел, о котором он думал, что моя ошибка была в другой стороне, и не ahí и в конце концов уже не sabí ни в qué он делал. Сейчас я протестировал первую команду и уже он делает это мне верно, seguiré программируя, большое спасибо!! –  28.12.2016, 20:42