it-swarm-pt.tech

java.net.ConnectException: Conexão recusada

Eu estou tentando implementar uma conexão TCP, tudo funciona bem do lado do servidor, mas quando eu executar 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)

Eu tentei mudar 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);
                }
            }
        }
    }
}
153
Samantha Catania

Esta exceção significa que não há serviço escutando no IP/porta que você está tentando se conectar:

  • Você está tentando se conectar ao IP/porta errado.
  • Você não iniciou seu servidor.
  • Seu servidor não está escutando conexões.
  • Nos servidores Windows, a fila de espera do registro de atendimento está cheia.
270
Collin Price

Gostaria de verificar:

  • Nome do host e porta que 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 conectar-se manualmente a partir da máquina cliente usando telnet ou PuTTY. Se isso for bem sucedido, o problema está no código do seu cliente. Se isso não acontecer, você precisa calcular por que isso não aconteceu. Wireshark pode ajudá-lo nessa frente.

34
Jon Skeet

Eu tive o mesmo problema com o corretor Mqtt chamado vernemq.mas resolveu adicionando o seguinte.

  1. $ Sudo vmq-admin listener show

para mostrar a lista o permitida ips e ports para 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 ser capaz de se conectar sem nenhum problema. 

Espero que isso resolva seu problema. enter image description here

4
MrOnyancha

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

4
Dao Lam

Você precisa conectar seu soquete de 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 a serverName , que deve corresponder ao nome ou ao IP da caixa na qual sua ServerSocket foi instanciada (o nome deve estar acessível na máquina cliente). BTW: Não é o nome que é importante, é tudo sobre endereços IP ...

4
home

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 consegui 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 aceitando conexões.

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

2
phoenix

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

"Eu hospedei no meu servidor em localhost e estava tentando se conectar a ele através de um emulador Android especificando URL apropriada como http://localhost/my_api/login.php. E eu estava recebendo erro de conexão recusada "

Aponte para nota - Quando eu fui apenas para o navegador no PC e usei a mesma URL (http://localhost/my_api/login.php) eu estava recebendo resposta correta

então o problema no meu caso foi o termo localhost que eu substituí com oIPpara o meu servidor (como seu servidor está hospedado em sua máquina) que o fez acessível a partir do meu emulador no mesmo PC.


Para obter o IP para a sua máquina local, você pode usar o comando ipconfig no cmd Para obter o IPv4 algo como 192.68.xx.yy Voila .. esse é o IP da sua máquina onde você tem seu servidor hospedado. use então em vez de localhost

http://192.168.72.66/my_api/login.php


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

1
eRaisedToX

No meu caso, eu tive que colocar uma marca de verificação perto de Expose daemon on tcp://localhost:2375 without TLS na configuração docker (no lado direito da barra de tarefas, clique com o botão direito do mouse em docker, selecione setting)

1
user1419243

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

1
Zhyano

eu tenho esse erro porque I closed ServerSocket inside a for loop que tentam aceitar o número de clientes dentro dele (eu não terminei de aceitar todos os clints)

então tenha cuidado onde fechar o seu soquete

1
Basheer AL-MOMANI

Eu tive o mesmo problema e o problema era que eu não estava fechando o objeto de soquete.Após o uso de 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();

    }
}
0
Santosh Karna

Eu tive o mesmo problema, e acabou por ser devido à permissão do arquivo catalina.out 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 tenho que saber que é um problema de permissões dos logs no arquivo Tomcat8-initd.log:

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

0
kbsbng

Número de porta sempre diferente nas duas extremidades

0
Harshil Kulkarni