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? 
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!
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??
Tenta isso
int to = 2000;
socket.connect(new InetSocketAddress(host,porta), to);
[quote=drsmachado]Tenta isso
int to = 2000;
socket.connect(new InetSocketAddress(host,porta), to);
[/quote]
Certo! Obrigada
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.