java.net.ConnectException: Bağlantı reddedildi


186

Bir TCP bağlantısı uygulamaya çalışıyorum, her şey sunucu tarafından iyi çalışıyor ama istemci programı (istemci bilgisayardan) çalıştırdığımda aşağıdaki hatayı alıyorum:

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)

Kullanımda olması durumunda soket numarasını değiştirmeyi denedim ama boşuna, herkes bu hataya neyin neden olduğunu ve nasıl düzeltileceğini biliyor mu?

Sunucu Kodu:

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

            }

        }
    }
}

Müşteri Kodu:

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

Müşteri kodunu gönderebilir misiniz? Uzak bir istemciyse, güvenlik duvarı sorunlarınız olmadığından emin olun!
ev

Hem istemci hem de sunucu güvenlik duvarlarını kapattım ve hala aynı sorun
Samantha Catania

2
Sunucu hangi arayüzü dinliyor? Yalnızca localhost üzerinden dinliyorsanız, uzaktan bağlanamazsınız.
Thorbjørn Ravn Andersen

Localhost, face palm kullanırken uzaktan bağlanmaya çalışıyordum. Bu benim TCP ile ilk denemem. <Uzaktan çalışmasını nasıl sağlayabilirim?
Samantha Catania

Aralarında bazı 'çıplak metal' donanım güvenlik duvarlarına da sahip olabileceğinizi unutmayın ... istemci ve sunucu aynı kutuda bulunuyorsa çalışır mı?
ev

Yanıtlar:


323

Bu istisna, bağlanmaya çalıştığınız IP / bağlantı noktasında herhangi bir hizmet dinlemediği anlamına gelir:

  • Yanlış IP / Ana Bilgisayar veya bağlantı noktasına bağlanmaya çalışıyorsunuz.
  • Sunucunuzu başlatmadınız.
  • Sunucunuz bağlantıları dinlemiyor.
  • Windows sunucularında, dinleme biriktirme listesi kuyruğu doludur.

52
Ben gözden kaçmış için aptal hissediyorum You have not started your server, ama gerçekten benim için sorun oldu!
Alexis Leclerc

Sadece noktayı açıklığa kavuşturmak için - "Java çekirdeği gayet iyi". Tek sorun sorunları gözden kaçırmaktır .. (sunucu durumu, ipadresi, bağlantı noktası, internet bağlantısı - yerel
IP'ler

1
Collin, 'sunucu bağlantıları kabul etmeyi beklemiyor' ile tam olarak ne demek istiyorsun? İnsanlar sanki bir şey ifade ediyormuş gibi papağan yapıyorlar.
Lorne Marquis

Bunu bir süre önce yazdım ama bence sunucunuzu başlatmadığınızı söylemenin başka bir yolu.
Collin Price

Benim durumumda çalışan dört Gennymotion simülatörü vardı ve uygulamayı Galaxy sekmesine yüklemeye çalışıyordum ve bu hatayı alıyordum. Arkadaş WEB'den çok şey okuduktan sonra, tüm simülatörleri ve tutulmayı kapattım, görev yöneticisinde ADP'yi öldürdüm ve sonra Eclipse'i yeniden başlattım ve her şey düzgün çalışmaya başladı. Çalışan birden fazla simülatörünüz olduğunda ve daha sonra cihazı bağlamaya çalıştığınızda, ADB benim deneyimimde çıldırıyor. bunlar benim iki sentim ... :)
Vincy

40

Kontrol ediyorum:

  • Bağlanmaya çalıştığınız ana makine adı ve bağlantı noktası
  • Sunucu tarafı doğru dinlemeye başlamayı başardı
  • Bağlantıyı engelleyen güvenlik duvarı yok

En basit başlangıç ​​noktası, telnet veya Putty kullanarak istemci makineden manuel olarak bağlanmaya çalışmaktır. Bu başarılı olursa, sorun istemci kodunuzdadır. Değilse, neden olmadığını anlamanız gerekir. Wireshark bu cephede size yardımcı olabilir.


Bu istisnayı bazen anlıyorum. Bu belirli bir süre için olur. Hemen bu istisnayı atar. Ve sonra her şey yoluna giriyor. Sunucuda bir güvenlik duvarım var. Ancak bağlantı noktası 8080'de gelen bağlantılara izin vermek için bir gelen kural ekledim. Kural bazen yok sayılıyor mu?
Ashwin

@Ashwin: Söylemek imkansız, gerçekten - verilerin tam olarak ne kadar ilerlediğini bulmanız gerekir. Güvenlik duvarı günlüklerinize vb. Bakın
Jon Skeet

@JonSkeet bu hatayı alırsak güvenlik duvarımızı nasıl yapılandırabiliriz?
Nikhil Pareek

1
@Nikhil: Buna cevap vermek nitelikli değilim, ama ben şüpheli kimse olduğunu nitelikli size yardımcı olmak için çok daha fazla bilgi gerekir. (Bir kere, hangi güvenlik duvarına sahip olduğunuzu bilmiyoruz ...)
Jon Skeet

7

İstemci soketinizi uzak ServerSocket'e bağlamanız gerekir. Onun yerine

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

yapmak

Socket clientSocket = new Socket(serverName, 5000);

İstemci , başlatıldığınız kutunun adıyla veya IP'si ile eşleşmesi gereken sunucuAdına bağlanmalıdır ServerSocket(ad, istemci makineden erişilebilir olmalıdır). BTW: Önemli olan isim değil, tamamen IP adresleriyle ilgili ...


Her ikisini de test amacıyla aynı makinede çalıştırdığını varsayıyorum, bu yüzden localhost'un kullanımı iyi olurdu
SE

@Aaron: İstemci ve sunucu aynı makinede çalışıyorsa işe yaradığını söyledi (cevabı başka bir yorumda bulabilirsiniz).
ev

'Yukarıdaki satır soketi localhost'a bağlar' Hayır, girmez INADDR_ANY'ye bağlar. Bu, herhangi bir NIC üzerinden bağlantı kabul etmesini sağlar. OP'nin yaptığı şey zaten doğrudur. Cevap tamamen yanlış. Downvoting.
Lorne Marquis

@EJP: Haklısın ServerSocket, cevabı değiştirdim. Yine de, clientSockethala bağlanmaya çalışır localhost.
ev

@home Bağlama adresi hakkındaki ifadeyi kaldırmanız gerekir .
Lorne Marquis

7

Aynı sorunu yaşadım, ancak İstemciyi çalıştırmadan önce Sunucuyu çalıştırmak sorunu çözdü.


4
Elbette istemciden önce sunucuyu çalıştırmanız gerekir. Önce istemciyi çalıştırmak ve sunucuya bağlanmaya çalışmak, sunucunuzu çalıştırdığınızda hiçbir şeye bağlanmamanız anlamına gelir.
user3308043

5
@ user3308043 Evet belliydi ama bazı yeni programcılar için çok açık değildi (3 yıl önce kendim gibi), bu yüzden sadece benim gibi clueless olan arkadaşlarla paylaşmak istedim.
Dao Lam

Teşekkürler, ayrıca bana yardımcı oldu, test bağlantısı başarılı oldu ama tablo verisi gösteremedi.
Damien Christophe

6

Yukarıdaki cevaplara eklemek istediğim bir nokta da benim tecrübelerim -

"Ben sunucum üzerinde localhost üzerinde barındırılan ve uygun URL belirterek bir android emülatör aracılığıyla bağlanmaya çalışıyordu http://localhost/my_api/login.php. Ve bağlantı reddedildi hatası alıyordum "

Dikkat edin - PC'de tarayıcıya yeni gittiğimde ve aynı URL'yi kullandığımda ( http://localhost/my_api/login.php) doğru yanıt alıyordum

bu yüzden benim durumumda sorun sunucum localhostiçin IP ile değiştirdiğim (sunucunuz makinenizde barındırıldığı için) aynı bilgisayardaki emülatörümden ulaşılabilir hale gelen terimdi.


Yerel makineniz için IP almak için ipconfigcmd komutunu kullanabilirsiniz , IPv4'ü 192.68.xx.yy Voila gibi bir şey alırsınız. Sunucunuzun barındırdığı makinenizin IP adresi budur. localhost yerine onu kullan

http://192.168.72.66/my_api/login.php


Not - bu özel IP'ye bu bilgisayarın dışındaki herhangi bir düğümden erişemezsiniz. (İhtiyacınız olursa, bunun için Ngnix'i kullanabilirsiniz)


4

Vernemq.but adlı Mqtt broker ile aynı sorunu vardı ama aşağıdaki ekleyerek çözüldü.

  1. $ sudo vmq-admin listener show

vernemq için izin verilen ips ve bağlantı noktalarının listesini gösterme

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

herhangi bir ip ve yeni bağlantı noktanızı eklemek için. şimdi u sorunsuz bir şekilde bağlanabilmelisiniz.

Umarım sorununuzu çözer. resim açıklamasını buraya girin


1
Bu benim günümü kurtardı, ancak vernemq apt-get ile yüklenmediğinden, bazı kişilerin bu bağlantıya ihtiyacı olacak: vernemq.com/docs/installation/debian_and_ubuntu.html
Damir Olejar

2

Umarım deneyimim birileri için yararlı olabilir. Aynı istisna yığını izlemeyle sorunla karşılaştım ve sorunun ne olduğunu anlayamadım. Bağlanmaya çalıştığım Veritabanı sunucusu çalışıyordu ve bağlantı noktası açıktı ve bağlantıları kabul ediyordu.

Sorun internet bağlantısı ile oldu. Kullandığım internet bağlantısının ilgili sunucuya bağlanmasına izin verilmedi. Bağlantı ayrıntılarını değiştirdiğimde sorun çözüldü.


1

Benim durumumda, sokete sunucunun adını verdim (benim durumumda "raspberrypi") ve bunun yerine bir IPv4 adresi yaptı veya belirtmek için IPv6 bozuldu (isim bir IPv6'ya çözüldü)


1

Benim durumumda, ben yakın bir onay işareti koymak zorunda Expose daemon on tcp://localhost:2375 without TLSiçinde docker(sağ tıklayın, görev çubuğunun sağ tarafındaki ayar dockerseçin setting)


1

çünkü ServerSocketiçinde istemci sayısını kabul etmeye çalışıyorum bir for döngüsü içinde kapalı ben bu hatayı aldım (tüm clints kabul bitmedi)

bu yüzden Soketinizi nerede kapattığınıza dikkat edin


0

Aynı sorunu vardı ve sorun soket nesnesini kapatmıyordu oldu. Socket.close () kullandıktan sonra; sorun çözüldü. Bu kod benim için çalışıyor.

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

ve 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();

    }
}

1
İstemci soketinin kapatılmaması bağlantı reddine neden olmaz. Orada olmaz olmak bağlantı reddedildi olsaydı sona bir istemci soket.
Lorne Marquis


-2

Aynı sorunu yaşadım ve catalina.outdosyanın izninin doğru olmaması nedeniyle ortaya çıktı . Tomcat kullanıcısı tarafından yazılabilir değildi. İzinleri düzelttikten sonra sorun çözüldü. tomcat8-initd.logDosyadaki günlüklerden bir izin sorunu olduğunu bilmek lazım :

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


1
'İzin reddedildi', 'bağlantı reddedildi' ile aynı şey değil.
Lorne Marquis

tomcat8-initd.logSunucu çıkış günlükleri tam olarak soruda belirtilen hataya sahipken İzin reddedildi hatası dosyadaydı .
kbsbng

-3

İstemcinin 5000 numaralı bağlantı noktasında hala çalışıp dinleyen önceki bir örneği olabilir.


6
Müşteriler dinlemiyor. Konuşuyorlar.
Raedwald

Önceki bir örnek , istemcide BindExceptiondeğil, sunucuda bir a neden olur ConnectException.
Lorne Marquis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.