[Resolvido] Problemas com Sockets

7 respostas
_

Olá! Estou tendo o meu primeiro contato com JAVA e com Sockets e estou tendo algumas dificuldades. Estou construindo um cliente socket que:

  • Se conecta em um host
  • Envia uma senha para autenticação
  • Fica conectado esperando por mensagens (cada uma composta por 20 caracteres ascii)…
System.out.println("Início");
  Socket socket = new Socket();
  socket.setKeepAlive(true);
  socket.connect(new InetSocketAddress(host,porta));
  System.out.println("Conectado em " + socket.getRemoteSocketAddress());
  DataOutputStream out = new DataOutputStream(socket.getOutputStream)
;
  out.writeUTF(senha);
  DataInputStream in = new DataInputStream(socket.getInputStream)
;
  while (true){

     String msg = in.readUTF()
;
     System.out.println(msg);
  }

Se eu coloco o host certo ele conecta, mas se eu coloco um host qualquer , ao invés de dar um erro, ele simplesmente fica em loop dentro do connect… Para mim é muito importante saber se estou conectada ou não porque terei que implementar algum método que caso o primeiro host caia conecte a um host alternativo.

A leitura não funciona da forma que está, dá o erro:

java.io.EOFException

at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:323)

at java.io.DataInputStream.readUTF(DataInputStream.java:572)

at java.io.DataInputStream.readUTF(DataInputStream.java:547)

Eu deveria ter algum mecanismo que solicitasse a string e ficasse esperando, mas não sei o que poderia usar…

alguma dica? :wink:

7 Respostas

rogerio.lacerda

Bruna,

Mexi a muito tempo com sockets em Java, mas vamos ver no que posso te ajudar.

Na api da classe java.net.Socket consta o método isConnected: http://download.oracle.com/javase/1.5.0/docs/api/java/net/Socket.html#isConnected()

Já tentou utiliza-lo?

_

Eu não consigo nem chegar aí!

Se eu coloco algo do tipo:

socket.connect(new InetSocketAddress(bruna”,2324))

ele dá um UnknownHostException. Mas se eu coloco um IP qualquer:

socket.connect(new InetSocketAddress(128.0.0.1”,2324)) ou       socket.connect(new InetSocketAddress(1.2.3.4”,2324))

ou qqr outra coisa ele fica em loop

Eu imaginei que ele fosse dar um timeout ou algo do tipo… Mas não acontece!

rogerio.lacerda

Ele fica em loop dentro do while, correto?

Antes de entrar nele veja se está conectado: socket.isConnected();

_

Na verdade não…

Ele fica preso no socket.connect…

ele não faz nada que coloque depois do connect… nem impressões

UPDATE: Na verdade eu não tinha deixado ele rodando nenhuma vez ele rodando mais de 10 minutos antes ¬¬ Passado esse timeout grandinho, o isConnected funciona direitinho sim… mas e em relaçã a forma de leitura??

drsmachado

Tenta isso

int to = 2000;
socket.connect(new InetSocketAddress(host,porta), to);
_

drsmachado:
Tenta isso

int to = 2000; socket.connect(new InetSocketAddress(host,porta), to);

Certo! Obrigada

drsmachado

Só complementando, o método connect pode ser invocado passando-se apenas o address ou o address e o timeout, como era a necessidade da bruna.

Precisando, estamos aí.
Se funcionou, muda o título do post para [resolvido], senão, posta ai pra vermos o que podemos fazer.

Criado 23 de maio de 2011
Ultima resposta 23 de mai. de 2011
Respostas 7
Participantes 3