Dado esse snippet de rastreamento de pilha
Causado por: java.net.SocketException: O software causou a interrupção da conexão: erro de gravação de soquete
em java.net.SocketOutputStream.socketWrite0 (método nativo)
Tentei responder às seguintes perguntas:
- Qual código está lançando essa exceção? (JVM? / Tomcat? / Meu código?)
- O que faz com que essa exceção seja lançada?
Em relação ao item 1:
A fonte JVM da Sun não contém essa mensagem exata, mas acho que o texto Software causou uma interrupção na conexão: erro de gravação de soquete é da implementação nativa de SocketOutputStream
:
private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;
Em relação a # 2
Meu palpite é que isso é causado quando o cliente encerra a conexão, antes de obter a resposta completa (por exemplo, envia uma solicitação, mas antes de obter a resposta completa, ela é fechada / finalizada / offline)
Questões:
- As premissas acima estão corretas (nº 1 e nº 2)?
- Isso pode ser diferenciado da situação: "não foi possível gravar no cliente devido a um erro de rede no servidor "? ou isso renderizaria a mesma mensagem de erro?
- E o mais importante: existe um documento oficial (por exemplo, da Sun) afirmando o acima?
Eu preciso ter uma prova de que esse rastreamento de pilha é a "falha" do cliente de soquete e não há nada que o servidor possa ter feito para evitá-lo. (exceto capturando a exceção ou usando um JVM SocketOutputStream que não seja da Sun, embora ambos não evitem o fato de o cliente ter terminado)
outs.write(audioBytes);
)byte[]
paraOutputStream
. Quando o áudio está tocando e durante a reprodução, se o usuário clicar em qualquer outro menu (que envia uma solicitação do servidor), recebi o mesmo erro no console. então é seguro ignorar essa exceção?Respostas:
Veja este artigo do MSDN . Consulte também Algumas informações sobre 'Interrupção de conexão causada por software' .
fonte
A
java.net.SocketException
é acionada quando há um erro ao criar ou acessar um soquete (como TCP ). Isso geralmente pode ser causado quando o servidor encerra a conexão (sem fechá-la corretamente), portanto, antes de obter a resposta completa. Na maioria dos casos, isso pode ser causado pelo problema de tempo limite (por exemplo, a resposta leva muito tempo ou o servidor está sobrecarregado com as solicitações) ou o cliente enviou o SYN, mas não recebeu ACK (reconhecimento da terminação da conexão) . Para problemas de tempo limite, considere aumentar o valor do tempo limite.A exceção de soquete geralmente vem com a mensagem de detalhes especificada sobre o problema.
Exemplo de mensagens detalhadas:
O erro indica uma tentativa de enviar a mensagem e a conexão foi interrompida pelo seu servidor. Se isso aconteceu durante a conexão com o banco de dados, isso pode estar relacionado ao uso do driver Connector / J JDBC não compatível .
Solução possível: verifique se você possui bibliotecas / drivers adequados no seu CLASSPATH.
Isso pode acontecer quando houver um problema para conectar-se ao controle remoto. Por exemplo, devido à verificação de vírus que rejeitou as solicitações de correio remoto .
Solução possível: verifique se o serviço de verificação de vírus está bloqueando a porta para as solicitações de saída de conexões.
Solução possível: verifique se você está escrevendo o tamanho correto de bytes no fluxo. Então verifique o que você está enviando. Veja este tópico .
O aplicativo não verificou se a conexão keep-alive havia atingido o tempo limite no servidor.
Solução possível: verifique se o HttpClient é não nulo antes de ler a partir da conexão. E13222_01
A conexão foi encerrada pelo par (servidor).
A conexão foi encerrada pelo cliente ou fechada pelo final do servidor devido a solicitação com a solicitação.
Consulte: O que está causando meu java.net.SocketException: Conexão redefinida?
fonte
HttpClient
sernull
não pode causar aSocketException
. Também não é possível escrever o comprimento correto no fluxo.Eu já vi isso com mais frequência quando um firewall corporativo em uma estação de trabalho / laptop atrapalha, mata a conexão.
por exemplo. Eu tenho um processo de servidor e um processo de cliente na mesma máquina. O servidor está escutando em todas as interfaces (0.0.0.0) e o cliente tenta uma conexão com a interface pública / home (observe a interface de loopback 127.0.0.1).
Se a máquina estiver com a rede desconectada (por exemplo, wifi desligado), a conexão será formada. Se a máquina estiver conectada à rede corporativa (diretamente ou VPN), a conexão será formada.
No entanto, se a máquina estiver conectada a um wifi público (ou rede doméstica), o firewall entra em ação e mata a conexão. Nessa situação, conectar o cliente à interface de loopback funciona bem, mas não à interface doméstica / pública.
Espero que isto ajude.
fonte
Para provar qual componente falha, eu monitorava a comunicação TCP / IP usando o wireshark e olhava quem está fechando completamente a porta, também os intervalos podem ser relevantes.
fonte
Você verificou o código-fonte do Tomcat e a fonte da JVM? Isso pode lhe dar mais ajuda.
Eu acho que o seu pensamento geral é bom. Eu esperaria um
ConnectException
no cenário que você não conseguiu conectar. O acima parece muito orientado para o cliente.fonte
Para quem usa programas simples do Client Server e obtém esse erro, é um problema de fluxos de entrada ou saída não fechados (ou fechados para o início).
fonte
Eu estava enfrentando o mesmo problema.
Comumente Esse tipo de erro ocorre porque o cliente fechou sua conexão e o servidor ainda está tentando gravar nesse cliente.
Portanto, verifique se o seu cliente tem sua conexão aberta até o servidor concluir o fluxo de saída.
E mais uma coisa, não se esqueça de fechar o fluxo de entrada e saída.
Espero que isto ajude.
E se ainda estiver enfrentando um problema, informe-o aqui em detalhes.
fonte
Este erro aconteceu comigo ao testar meu serviço de sabão com o cliente SoapUI, basicamente eu estava tentando receber uma mensagem muito grande (> 500kb) e o SoapUI fechou a conexão por tempo limite.
... e coloque um valor grande, como 180000 (3 minutos), essa não será a correção perfeita para o seu problema, pois o arquivo é realmente grande demais, mas pelo menos você terá uma resposta.
fonte
Conexão fechada em outro cliente
No meu caso, o erro foi:
Foi recebido no eclipse durante a depuração de um aplicativo java acessando um banco de dados H2. A origem do erro foi que eu havia aberto o banco de dados com o SQuirreL para verificar manualmente a integridade. Eu usei o sinalizador para habilitar várias conexões com o mesmo banco de dados (ou seja
AUTO_SERVER=TRUE
), portanto não houve problema em conectar-se ao banco de dados a partir de java.O erro apareceu quando, depois de um tempo - é um longo processo java -, decidi fechar o SQuirreL para liberar recursos. Parece que SQuirreL foi o "proprietário" da instância do servidor DB e que foi encerrada com a conexão SQuirreL.
Reiniciar o aplicativo Java não produziu o erro novamente.
config
fonte
No meu caso, desenvolvi o lado do cliente e do servidor e tenho a exceção:
quando as classes no cliente e no servidor são diferentes. Não baixo as classes do servidor (Interfaces) no cliente, apenas adiciono os mesmos arquivos no projeto. Mas o caminho deve ser exatamente o mesmo. Por exemplo, no projeto do servidor, eu tenho pacotes java \ rmi \ services com alguns serviceInterface e implementações, preciso criar o mesmo pacote no projeto do cliente. Se eu mudar por java / rmi / server / services, por exemplo, recebo a exceção acima. Mesma exceção se a versão da interface for diferente entre cliente e servidor (mesmo com uma linha vazia adicionada inadvertidamente ... acho que o rmi faz uma espécie de hash de classes para verificar a versão ... não sei ... se pudesse Socorro ...
fonte
Meu servidor estava lançando essa exceção nos últimos dois dias e resolvi-a movendo a função desconectar com:
Até o final do segmento da lista. se isso ajudou alguém.
fonte
Na situação explicada abaixo, o lado do cliente lançará uma exceção:
O servidor é solicitado a autenticar o certificado do cliente, mas o cliente fornece um certificado cujo uso estendido de chave não oferece suporte à autenticação do cliente; portanto, o servidor não aceita o certificado do cliente e fecha a conexão.
fonte
O lado do cliente ssl lançará essa exceção na situação abaixo (eu testei):
o servidor é solicitado a autenticar o certificado do cliente, mas o cliente fornece um certificado que o uso estendido de chave não oferece suporte à autenticação do cliente.
fonte
Eu estava enfrentando o mesmo problema com o wireMock enquanto zombava das demais chamadas da API. Anteriormente, eu estava definindo o servidor assim:
Mas deve ser definido como mostrado abaixo:
fonte
NullPointerException
problema, não esse.