Pessoal, estou com um problema aqui, eu ja postei sobre isso no forum mas a solucao que me apresentaram parece que não surgiu efeito para correção do bug.
Metodo de comunicação: Sockets
Estrutura fisica: Wireless LAN
O problema é que fica dando ReadTimeOut toda hora e as vezes segue de ConnectionRefused, e não é problema de interrupção no sinal, por que já testei no cabo também e sem solução (todos os metodos estão em sincronia, ja verifiquei e não esta acotnecendo um deadlock)
Uma maneira de contornar esse problema foi a inserção de um reconnect toda vez que da um desses erros, mas o problema é que TODA hora da esse problema…
O programa está assim:
Possuo uma classe interna que fica lendo os dados o tempo todo, esse processo é feito escrevendo uma mensagem no socket e lendo a resposta.
public synchronized void connect(String ip, int port) {
try {
InetSocketAddress inet = new InetSocketAddress(ip, port);
socket = new Socket();
socket.connect(inet, 2000);
socket.setSoTimeout(2500);
in = socket.getInputStream();
out = socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
Sim, já experimentei.
O timeout esta suficiente para ler os dados, são strings pequena de no max 50 caracteres e a comunicação é direta, não há interrupção no sinal, até no cabo acontece no mesmo problema.
[quote=Vinicius Zibetti Resko]Sim, já experimentei.
O timeout esta suficiente para ler os dados, são strings pequena de no max 50 caracteres e a comunicação é direta, não há interrupção no sinal, até no cabo acontece no mesmo problema.[/quote]
O dispositivo que fornece as strings que você vai ler usa corretamente os comandos do socket TCP (shutdown)?
O equipamento verifica a string e devolve uma resposta para o socket.
Segue stack trace:
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at com.network.EthernetComm.readFromPort(EthernetComm.java:120)
at com.view.Main$Reading.run(Main.java:817)
Vinicius, você não configurou o socket para usar a opção TcpNodelay. Faça isso o mais rápido possível - porque como as mensagens são muito pequenas, e você tem um protocolo “chatty” (ou seja, você manda uma mensagem pequenininha e quer uma resposta imediatamente) então você precisa setar o tcpnodelay para true. Siga o que seu xará Vinicius Godoy lhe recomendou. Deixar isso não afeta em nada o desempenho, já que seu protocolo é “chatty”. Se você tivesse um protocolo do tipo “as mensagens de entrada são independentes das mensagens de saída” você então deveria setar o tcpnodelay para false (que é o default).
O seu código, que está abaixo, não seta o tcpnodelay para true explicitamente. Você tem de setar isso explicitamente.
InetSocketAddress inet = new InetSocketAddress(ip, port);
socket = new Socket();
socket.connect(inet, 2000);
socket.setSoTimeout(2500);
in = socket.getInputStream();
out = socket.getOutputStream();
entanglement , eu ja testei aqui ativar o tcpnodelay, infelizmente o erro persiste.
O que está acontecendo é que ele esta lendo normalmente ai do nada ele da um timeout, ai reconecta, ai le mais algumas vezes, ai da erro de novo e assim vai…
Quem está do outro lado da conexão? É uma aplicação sua ou de terceiros?
Já rodou no wireshark para ver se o outro lado não está abandonando a conexão?