java.net.ConnectException: conexão recusada

186

Estou tentando implementar uma conexão TCP, tudo funciona bem do lado do servidor, mas quando executo o programa cliente (do computador cliente), recebo o seguinte erro:

java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
        at java.net.Socket.connect(Socket.java:529)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:189)
        at TCPClient.main(TCPClient.java:13)

Tentei alterar o número do soquete no caso de estar em uso, mas sem sucesso, alguém sabe o que está causando esse erro e como corrigi-lo.

O código do servidor:

//TCPServer.java

import java.io.*;
import java.net.*;

class TCPServer {
    public static void main(String argv[]) throws Exception {
        String fromclient;
        String toclient;

        ServerSocket Server = new ServerSocket(5000);

        System.out.println("TCPServer Waiting for client on port 5000");

        while (true) {
            Socket connected = Server.accept();
            System.out.println(" THE CLIENT" + " " + connected.getInetAddress()
                    + ":" + connected.getPort() + " IS CONNECTED ");

            BufferedReader inFromUser = new BufferedReader(
                    new InputStreamReader(System.in));

            BufferedReader inFromClient = new BufferedReader(
                    new InputStreamReader(connected.getInputStream()));

            PrintWriter outToClient = new PrintWriter(
                    connected.getOutputStream(), true);

            while (true) {

                System.out.println("SEND(Type Q or q to Quit):");
                toclient = inFromUser.readLine();

                if (toclient.equals("q") || toclient.equals("Q")) {
                    outToClient.println(toclient);
                    connected.close();
                    break;
                } else {
                    outToClient.println(toclient);
                }

                fromclient = inFromClient.readLine();

                if (fromclient.equals("q") || fromclient.equals("Q")) {
                    connected.close();
                    break;
                } else {
                    System.out.println("RECIEVED:" + fromclient);
                }

            }

        }
    }
}

O Código do Cliente:

//TCPClient.java

import java.io.*;
import java.net.*;

class TCPClient {
    public static void main(String argv[]) throws Exception {
        String FromServer;
        String ToServer;

        Socket clientSocket = new Socket("localhost", 5000);

        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
                System.in));

        PrintWriter outToServer = new PrintWriter(
                clientSocket.getOutputStream(), true);

        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
                clientSocket.getInputStream()));

        while (true) {

            FromServer = inFromServer.readLine();

            if (FromServer.equals("q") || FromServer.equals("Q")) {
                clientSocket.close();
                break;
            } else {
                System.out.println("RECIEVED:" + FromServer);
                System.out.println("SEND(Type Q or q to Quit):");

                ToServer = inFromUser.readLine();

                if (ToServer.equals("Q") || ToServer.equals("q")) {
                    outToServer.println(ToServer);
                    clientSocket.close();
                    break;
                } else {
                    outToServer.println(ToServer);
                }
            }
        }
    }
}
Samantha Catania
fonte
Você pode postar o código do cliente? Se for um cliente remoto, verifique se não há problemas de firewall!
Home
Desliguei firewalls no cliente e servidor e ainda mesmo problema
Samantha Catania
2
Em qual interface o servidor está escutando. Se você estiver ouvindo apenas no host local, não poderá se conectar remotamente.
Thorbjørn Ravn Andersen
Eu estava tentando se conectar remotamente enquanto usava o host local, a palma da mão. Este é o meu primeiro teste com o TCP>. <Como faço para funcionar remotamente?
Samantha Catania
Lembre-se de que você também pode ter alguns firewalls de hardware 'bare metal' ... funciona se o cliente e o servidor estiverem na mesma caixa?
Home

Respostas:

323

Essa exceção significa que não há serviço atendendo na porta / IP à qual você está tentando se conectar:

  • Você está tentando se conectar ao IP / host ou porta incorretos.
  • Você não iniciou seu servidor.
  • Seu servidor não está escutando conexões.
  • Nos servidores Windows, a fila de recebimento de pedidos pendentes está cheia.
Preço de Collin
fonte
52
Eu me sinto idiota por ter esquecido o You have not started your serverassunto, mas foi realmente o problema para mim!
Alexis Leclerc
Apenas para esclarecer a questão - "o núcleo Java está ótimo". O único problema é que ignoram questões .. (estado do servidor, ipaddress, porto, conectividade com a Internet - estar no mesmo roteador é necessário para IP do local e mais)
Vinay Bhargav
1
Collin, o que exatamente você quer dizer com 'o servidor não está esperando para aceitar conexões'? As pessoas estão repetindo isso como se isso significasse alguma coisa.
Marquês de Lorne
Eu escrevi isso há um tempo atrás, mas acho que eu quis dizer isso como outra maneira de dizer que você não iniciou seu servidor.
Collin Price
no meu caso, eu tinha quatro simuladores Gennymotion em execução e estava tentando carregar o aplicativo na guia Galaxy e estava recebendo esse erro. Depois de ler muito do amigo WEB, fechei todos os simuladores e eclipse, matei o ADP no gerenciador de tarefas e, em seguida, reiniciei o Eclipse e tudo começou a funcionar corretamente. Eu acho que quando você tem vários simuladores em execução e tenta conectar o dispositivo, o ADB fica louco na minha experiência. esses são os meus dois centavos ... :)
Vincy
40

Eu verificaria:

  • Nome do host e porta à qual você está tentando se conectar
  • O lado do servidor conseguiu começar a ouvir corretamente
  • Não há firewall bloqueando a conexão

O ponto de partida mais simples é provavelmente tentar se conectar manualmente a partir da máquina cliente usando telnet ou Putty. Se isso der certo, o problema está no código do seu cliente. Caso contrário, você precisa descobrir por que não. O Wireshark pode ajudá-lo nessa frente.

Jon Skeet
fonte
Eu recebo essa exceção algumas vezes. Isso acontece por um determinado período de tempo. Ele lança imediatamente essa exceção. E então tudo fica bem. Eu tenho um firewall no servidor. Mas eu adicionei uma regra de entrada para permitir conexões de entrada na porta 8080. A regra é ignorada algumas vezes?
Ashwin
@ Ashwin: É impossível dizer, realmente - você precisaria descobrir exatamente até que ponto os dados estão chegando. Veja seus logs de firewall etc.
Jon Skeet
@ JonSkeet como configurar nosso firewall se tivermos esse erro?
precisa saber é o seguinte
1
@Nikhil: Eu não estou qualificado para responder a isso, mas eu qualquer um suspeito que é qualificado precisaria de muito mais informação para ser capaz de ajudá-lo. (Por um lado, não sabemos o que o firewall que têm ...)
Jon Skeet
7

Você precisa conectar o soquete do cliente ao ServerSocket remoto. Ao invés de

Socket clientSocket = new Socket("localhost", 5000);

Faz

Socket clientSocket = new Socket(serverName, 5000);

O cliente deve se conectar ao serverName, que deve corresponder ao nome ou IP da caixa na qual sua ServerSocketinstância foi instanciada (o nome deve estar acessível na máquina do cliente). BTW: Não é o nome que é importante, é tudo sobre endereços IP ...

casa
fonte
Presumo que ela esteja executando ambos na mesma máquina para fins de teste e é por isso localhost seria bom para usar
SE
@ Aaron: Ela disse que funciona se o cliente e o servidor rodarem na mesma máquina (você pode encontrar a resposta em outro comentário).
home
'A linha acima vincula o soquete ao localhost' Não, não vincula a INADDR_ANY. Isso permite aceitar conexões por meio de qualquer NIC. O que o OP está fazendo já está correto. A resposta está completamente incorreta. Downvoting.
Marquês de Lorne
@ EPJ: Você está certo com o ServerSocket, eu modifiquei a resposta. No entanto, o clientSocketainda tenta se conectar localhost.
home
@home Você precisa remover a frase sobre o endereço de ligação.
Marquês de Lorne
7

Eu tive o mesmo problema, mas executar o servidor antes de executar o cliente o corrigiu.

Dao Lam
fonte
4
Claro que você precisa executar o servidor antes do cliente. Executar o cliente primeiro e tentar conectar-se ao servidor significa que você não está se conectando a nada quando inicia o servidor.
user3308043
5
@ user3308043 Sim, era óbvio, mas não era muito óbvio para alguns novos programadores (como eu, há 3 anos), então eu só queria compartilhá-lo com aqueles colegas que não tinham noção de mim.
Dao Lam
Obrigado, também me ajudou, a conexão de teste foi bem-sucedida, mas não conseguiu mostrar nenhum dado da tabela.
Damien Christophe
6

Um ponto que gostaria de acrescentar às respostas acima é a minha experiência -

"Hospedei no meu servidor no host local e estava tentando conectar-me a ele através de um emulador do Android , especificando o URL adequado http://localhost/my_api/login.php. E estava recebendo erro de conexão recusada "

Aponte para observação - Quando fui ao navegador no PC e usei a mesma URL ( http://localhost/my_api/login.php) , estava obtendo resposta correta

portanto, o problema no meu caso foi o termo localhostque substituí pelo IP do meu servidor (como o servidor está hospedado na sua máquina) que o tornou acessível a partir do meu emulador no mesmo PC.


Para obter IP para a sua máquina local, você pode usar o ipconfigcomando cmd para obter o IPv4 algo como 192.68.xx.yy Voila .. esse é o IP da sua máquina em que o servidor está hospedado. use-o então em vez de localhost

http://192.168.72.66/my_api/login.php


Nota - você não poderá alcançar esse IP privado a partir de qualquer nó fora deste computador. (Caso você precise, você pode usar o Ngnix para isso)

eRaisedToX
fonte
4

Eu tive o mesmo problema com o broker Mqtt chamado vernemq.but resolveu adicionando o seguinte.

  1. $ sudo vmq-admin listener show

para mostrar a lista de ips e portas permitidos para o vernemq

  1. $ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000

para adicionar qualquer ip e sua nova porta. agora você deve conseguir se conectar sem nenhum problema.

Espero que resolva o seu problema. insira a descrição da imagem aqui

MrOnyancha
fonte
1
Isso salvou meu dia, mas como o vernemq não é instalado com o apt-get, algumas pessoas precisam deste link: vernemq.com/docs/installation/debian_and_ubuntu.html
Damir Olejar
2

Espero que minha experiência possa ser útil para alguém. Enfrentei o problema com o mesmo rastreamento de pilha de exceção e não conseguia entender qual era o problema. O servidor de banco de dados que eu estava tentando conectar estava em execução e a porta estava aberta e estava aceitando conexões.

O problema foi com a conexão à Internet. A conexão à Internet que eu estava usando não tinha permissão para se conectar ao servidor correspondente. Quando alterei os detalhes da conexão, o problema foi resolvido.

Fénix
fonte
1

No meu caso, dei ao soquete o nome do servidor (no meu caso "raspberrypi") e, em vez disso, um endereço IPv4 o criou ou, para especificar, o IPv6 foi quebrado (o nome foi resolvido para um IPv6)

Zhyano
fonte
1

No meu caso, eu tive que colocar uma marca de seleção próxima Expose daemon on tcp://localhost:2375 without TLSna dockerconfiguração (no lado direito da barra de tarefas, clique com o botão direito do mouse em docker, selecione setting)

user1419243
fonte
1

eu recebi esse erro porque fechei ServerSocket dentro de um loop for que tentava aceitar o número de clientes dentro dele (não terminei de aceitar todas as clints)

tenha cuidado onde fechar seu soquete

Basheer AL-MOMANI
fonte
0

Eu tive o mesmo problema e o problema era que eu não estava fechando o objeto socket. Depois de usar o socket.close (); problema resolvido. Este código funciona para mim.

ClientDemo.java

public class ClientDemo {
    public static void main(String[] args) throws UnknownHostException,
            IOException {
        Socket socket = new Socket("127.0.0.1", 55286);
        OutputStreamWriter os = new OutputStreamWriter(socket.getOutputStream());
        os.write("Santosh Karna");
        os.flush();
        socket.close();
    }
}

e ServerDemo.java

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        System.out.println("server is started");
        ServerSocket serverSocket= new ServerSocket(55286);
        System.out.println("server is waiting");
        Socket socket=serverSocket.accept();
        System.out.println("Client connected");
        BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String str=reader.readLine();
        System.out.println("Client data: "+str);
        socket.close();
        serverSocket.close();

    }
}
Santosh Karna
fonte
1
Não fechar o soquete do cliente não causa uma recusa de conexão. Há não ser uma tomada de cliente para perto se a conexão foi recusada.
Marquês de Lorne
0

Mudei minha rede DNS e resolveu o problema

Eli Nb
fonte
-2

Eu tive o mesmo problema e acabou por ser devido à permissão do catalina.outarquivo não estar correto. Não foi gravável pelo usuário do tomcat. Depois de corrigir as permissões, o problema foi resolvido. Eu soube que é um problema de permissão dos logs no tomcat8-initd.logarquivo:

/usr/sbin/tomcat8: line 40: /usr/share/tomcat8/logs/catalina.out: Permission denied

kbsbng
fonte
1
'Permissão negada' não é a mesma coisa que 'conexão recusada'.
Marquês de Lorne
O erro de permissão negada estava no tomcat8-initd.logarquivo enquanto os logs de saída do servidor tinham exatamente o erro mencionado na pergunta.
kbsbng 13/04
-3

Pode ser que exista uma instância anterior do cliente ainda em execução e escutando na porta 5000.

Michael Munsey
fonte
6
Clientes não ouvem. Eles falam.
Raedwald 29/07
Uma instância anterior causaria a BindExceptionno servidor, não a ConnectExceptionno cliente.
Marquês de Lorne