risposta-alla-domanda-sullo-sviluppo-web-bd.com

java.net.ConnectException: connessione rifiutata

Sto cercando di implementare una connessione TCP, tutto funziona bene dal lato del server, ma quando eseguo il programma client (dal computer client) ottengo il seguente errore:

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)

Ho provato a cambiare il numero di socket nel caso in cui fosse in uso, ma senza alcun risultato, qualcuno sa che cosa sta causando questo errore e come risolverlo.

Il codice server:

//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);
                }

            }

        }
    }
}

Il codice 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

Questa eccezione indica che non vi è alcun ascolto del servizio sull'IP/porta a cui si sta tentando di connettersi:

  • Stai provando a connetterti all'IP/porto sbagliato.
  • Non hai ancora avviato il tuo server.
  • Il tuo server non sta ascoltando le connessioni.
  • Sui server Windows, la coda del backlog di ascolto è piena.
270
Collin Price

Controllerei:

  • Nome host e porta a cui stai tentando di connettersi
  • Il lato server è riuscito ad avviare correttamente l'ascolto
  • Non c'è nessun firewall che blocca la connessione

Il punto di partenza più semplice è probabilmente quello di provare a connettersi manualmente dalla macchina client usando telnet o PuTTY. Se ciò riesce, allora il problema è nel tuo codice cliente. In caso contrario, è necessario risolvere perché non è così. Wireshark potrebbe aiutarti su questo fronte.

34
Jon Skeet

Ho avuto lo stesso problema con il broker Mqtt chiamato vernemq.but risolto con l'aggiunta di quanto segue.

  1. $ Sudo vmq-admin listener show

per mostrare la lista o permesso ips e ports per vernemq

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

per aggiungere qualsiasi IP e la tua nuova porta. ora dovresti riuscire a connetterti senza problemi. 

Spero che risolva il tuo problema .  enter image description here

4
MrOnyancha

Ho avuto lo stesso problema, ma l'esecuzione del server prima di eseguire il client lo ha risolto. 

4
Dao Lam

Devi connettere il tuo client socket al ServerSocket remoto. Invece di

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

fare 

Socket clientSocket = new Socket(serverName, 5000);

Il client deve connettersi a serverName che deve corrispondere al nome o IP della casella in cui è stata istanziata la ServerSocket (il nome deve essere raggiungibile dalla macchina client). BTW: Non è il nome che è importante, è tutto sugli indirizzi IP ...

4
home

Spero che la mia esperienza possa essere utile a qualcuno. Ho affrontato il problema con la stessa traccia dello stack di eccezione e non ho potuto capire quale fosse il problema. Il server di database che stavo cercando di connettersi era in esecuzione e la porta era aperta e stava accettando le connessioni.

Il problema era con la connessione internet. La connessione Internet che stavo usando non era autorizzata a connettersi al server corrispondente. Quando ho cambiato i dettagli della connessione, il problema è stato risolto.

2
phoenix

Un punto che vorrei aggiungere alle risposte di cui sopra è la mia esperienza -

"Ho ospitato il mio server su localhost e stavo cercando di connettermi tramite un emulatore di Android specificando l'URL corretto come http://localhost/my_api/login.php. E stavo ricevendo errore di connessione rifiutata "

Punto da notare - Quando sono appena andato al browser sul PC e uso lo stesso URL (http://localhost/my_api/login.php) stavo ottenendo una risposta corretta

quindi il problema nel mio caso era il termine localhost che ho sostituito conIPper il mio server (dato che il tuo server è ospitato sulla tua macchina) che lo ha reso raggiungibile dal mio emulatore sullo stesso PC.


Per ottenere l'IP per la tua macchina locale, puoi usare il comando ipconfig su cmd Otterrai IPv4 qualcosa come 192.68.xx.yy Voila ..che è l'IP della tua macchina in cui hai il server ospitato . Usa allora invece di localhost

http://192.168.72.66/my_api/login.php


Nota: non sarà possibile raggiungere questo IP privato da nessun nodo esterno al computer. (Nel caso sia necessario, puoi usare Ngnix per quello)

1
eRaisedToX

Nel mio caso, ho dovuto inserire un segno di spunta vicino a Expose daemon on tcp://localhost:2375 without TLS nell'impostazione docker (sul lato destro della barra delle applicazioni, fare clic con il tasto destro su docker, selezionare setting)

1
user1419243

Nel mio caso, ho dato al socket il nome del server (nel mio caso "raspberrypi"), e invece un indirizzo IPv4 lo ha reso, o per specificare, IPv6 era rotto (il nome risolto in un IPv6)

1
Zhyano

ho ricevuto questo errore perché I closed ServerSocket inside a for loop che tenta di accettare il numero di client al suo interno (non ho finito di accettare tutti i clints)

quindi stai attento a dove chiudere la tua presa

1

Ho avuto lo stesso problema e il problema era che non stavo chiudendo l'oggetto socket. Dopo aver usato socket.close (); problema risolto . Questo codice funziona per me.

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

Ho avuto lo stesso problema, ed è risultato essere dovuto al permesso del file catalina.out che non è corretto. Non era scrivibile dall'utente Tomcat. Una volta risolti i permessi, il problema è stato risolto. Devo sapere che si tratta di un problema di autorizzazioni dai log nel file Tomcat8-initd.log:

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

0
kbsbng

Numero di porta sempre diverso a entrambe le estremità

0