[Ajuda] Sockets e execucao de comando

10 respostas
I

A parte mais facil foi tratar de abrir e conectar o cliente e servidor.
Mas eis o que eu estou me batendo:

  1. DataOutputStream/DataInputStream
  2. Execucao de comando na shell do unix

Pois bem…Eu venho de C,então eu conheco as funções read e write pra mandar a msg e a system que executa uma string passada como argumento como um comando no shell.

Só que eu não estou entendendo esse negocio de DataStream:é um canal ligado nos dois sockets por onde vc envia a mensagem ou pior ainda,vc tem que criar um pacote (ou colocar os dados em alguma estrutura ligada ao socket da maquina) que se utiliza desse canal pra chegar ate o servidor/cliente?

E quanto à execucao de comando: eu encontrei a classe Runtime com o método exec(),mas mesmo depois de ler a documentacao e procurar exemplos na internet não consigo fazer isso funcionar pq pelo que estava escrito no log,não é possivel referenciar um metodo não-estatico no main.Tá…isso podia ser resolvido tirando-se o ‘static’ da declaracao do main,mas quero saber se tem jeito de fazer deixando a coisa como está.

Fora essas duas coisas,me falta descobrir como vou mandar o resultado do comando executado no servidor para o cliente…
É meio nonsense escolher linguagem nova pra fazer trabalho,mas achei que Java seria mais facil justamente por nao ter aquele bando de flags do C e por ter um metodo para envio de dados urgentes (que eu não faço a menor idéia de como se faz em C)

EDIT:e outras coisas: pela lógica,o servidor tem que executar o listen.Mas não existe listen!A documentacao oficial diz que SocketImpl é a superclasse comum de todas aquelas que implementam sockets.Deduzo que nisso estaria inclusa a classe ServerSocket,mas nem pelo autocompletar do Eclipse e nem escrevendo o nome do método a IDE aceita.

10 Respostas

J

Lá no meu blog tem um chat que usa Sockets, dá uma olhada nele, talvez ajude…

http://jairelton.com em downloads

pra executar o comando é…

try{ Runtime.getRuntime().exec("seu comando"); }catch(Exception e){ e.printStackTrace(); }

I

ah,entao não precisa ‘alocar’ um processo no servidor pro exec?
E desculpe se o edit apareceu depois que vc postou,pq eu nao tinha ido na listagem dos tópicos.

Notei que vc não usou o listen.Pode me explicar pq é assim em java ou qndo se usa o metodo?

J

Como assim “alocar um processo”??

E o que você chama de ‘listen’?

I

bom,cada cliente nao vai ser um processo no servidor?

o listen é o que o servidor faz,oras :stuck_out_tongue: Em C tem uma funcao listen(int descritor_do_socket,int Tamanho_fila) que tem que ser declarada antes do while aceitar as conexões.

Eu vi que a SocketImpl tem isso e tmb tem a de envio de dados urgentes,que é uma das coisas que eu preciso,mas se eu não consigo nem usar o listen,como raios eu vou mandar dados urgentes?

J

Acho que você está entrando em uma coisa meio baixo nivel, não?

Veja:
public classe Servidor{
   public static void main(String[] args){
      ServerSocket server = new ServerSocket(1010);

      while(true){
         Socket cliente = server.accept();
         Thread t = Thread(new Comunicador(cliente));
         t.start();
      }
   }
   class Comunidador implements Runnable{
      private Socket cliente;

      public Comunicador(Socket cliente){
         this.cliente = cliente;
      }

      public void run(){
          BufferedReader in = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
          String dados = in.readLine();
          System.out.println(dados);
          in.close();
          cliente.close();
      }
   }
}
public class Cliente{
   public static void main(String[] args){
       Socket sock = new Socket("127.0.0.1", 2020);
       PrintStream ps = new PrintStream(sock.getOutputStream());
       ps.println("Olá servidor!");
       ps.close();
       sock.close();
   }
}

Se funciona esse exemplo aí eu não sei, porque eu não testei, mas é mais ou menos por aí!

I

É de se esperar pq eu escovo bit em C…por isso que eu to meio perdida em java…

I

pessoas,esse negocio de comando eu ja entendi como funciona.o problema agora é com o método sendUrgentData.Segundo a doc do 1.4.2,o argumento é um inteiro.Só que como eu estou executando comandos,entao tenho que usar uma string,justamente pra guardar todo o tipo de saida do comando.

Ou seja: eu tenho a função mas simplesmente nao sei como usar,pq pela logica,eu tenho um stream de dados,entao eu tenho que escrever nele (Sout.writeByte((int)CH) , com CH sendo o dado urgente) e depois dar um flush pra mandar tudo.

Como raios eu mando e cato esse dado urgente no servidor??Pq ja tentei transformar em string pra depois comparar,mas nao deu certo.E o envio desses dados tem que ser explicito…

Só que pelo que eu entendo,os dados urgentes só fazem sentido quando vc tem um servidor concorrente com vários threads,alguns tomando mais tempo que outros e,ao receber esse dado,ele passaria automaticamente para o primeiro lugar na fila de prioridades.Mas o servidor do trabalho nao foi especificado e nos estamos estudando so os iterativos…

J

Você só pode mandar 1 byte com sendUrgentData(), mas porque precisar usar isso, e não pode mandar os dados normalmente?

I

Essa do byte eu ja sabia por causa da documentacao.
Eis o que esta dando esse pepino…

//Cliente

char CH=q;

Comando=Keyboard.readString();

Comando.trim();
if (Comando.compareTo(exit)==0)

sout.sendUrgentData((int)CH);

else

{  Sout.writeUTF(Comando));

Sout.flush();

}
//Servidor

while (true)

{ scs.setOOBInLine(true);

Comando=Sin.readUTF();

if (Comando.compareTo(exit))

scs.close();

else

//filtrar

}

Eu realmente nao sei como sair disso…Eu joguei esse byte no meio,sem mudar nada pra ver no que dava e sai EOFException,logo no catch do readUTF().

Jair,nem eu to entendendo pq raios ele quer dados urgentes,mas tai a especificacao do trabalho… Ta na parte 2 . http://www.inf.ufpr.br/elias/redes/tpRedesII2006-1.html

I

Tá…já resolvi meus problemas com o envio dos comandos e do dado urgente.Pelo menos em parte,porque a ideia foi escrever em bytes no canal e depois ler do outro lado como string com readLine (BufferedReader).

Agora essa coisinha me retorna a msg “PlainSocketImpl:sending of urgent data not supported” no cliente.

Tava lendo a doc e estou chutando que eu tenho que sobrescrever o método pra retornar true,mas…tem certas coisas que eu nao to entendendo… diz que a SocketImpl é superclasse comum de todas as que implementam sockets,mas eu não consigo usar os métodos dela,pq so tem os metodos herdados de java.lang.Object (heranca multipla às vezes é uma bênção)

E como eu saio desse erro?

Criado 31 de maio de 2006
Ultima resposta 12 de jun. de 2006
Respostas 10
Participantes 2