java.net.ConnectException: Koneksi ditolak

186

Saya mencoba menerapkan koneksi TCP, semuanya berfungsi dengan baik dari sisi server tetapi ketika saya menjalankan program klien (dari komputer klien) saya mendapatkan kesalahan berikut:

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)

Saya mencoba mengubah nomor soket jika sedang digunakan tetapi tidak berhasil, apakah ada yang tahu apa yang menyebabkan kesalahan ini & bagaimana cara memperbaikinya.

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

            }

        }
    }
}

Kode Klien:

//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
sumber
Bisakah Anda memposting kode klien? Jika itu adalah klien jarak jauh, pastikan Anda tidak memiliki masalah firewall!
rumah
Saya mematikan firewall di kedua klien & server & masih masalah yang sama
Samantha Catania
2
Apa antarmuka server mendengarkan. Jika Anda hanya mendengarkan di localhost, Anda tidak dapat terhubung dari jarak jauh.
Thorbjørn Ravn Andersen
Saya mencoba untuk terhubung dari jarak jauh saat menggunakan localhost, face palm. Ini adalah uji coba pertama saya dengan TCP>. <Bagaimana cara membuatnya bekerja dari jarak jauh?
Samantha Catania
Ingat bahwa Anda mungkin memiliki beberapa firewall perangkat keras 'logam kosong' di antara keduanya ... apakah itu berfungsi jika klien dan server berada di kotak yang sama?
rumah

Jawaban:

323

Pengecualian ini berarti bahwa tidak ada layanan mendengarkan pada IP / port yang Anda coba sambungkan:

  • Anda mencoba menyambungkan ke IP / Host atau port yang salah.
  • Anda belum memulai server Anda.
  • Server Anda tidak mendengarkan koneksi.
  • Pada server Windows, antrian backlog mendengarkan penuh.
Harga Collin
sumber
52
Aku merasa bodoh karena telah mengabaikannya You have not started your server, tapi itu memang masalah bagiku!
Alexis Leclerc
Hanya untuk memperjelasnya - "Java core is fine". Satu-satunya masalah adalah kita mengabaikan masalah .. (keadaan server, ipaddress, port, konektivitas internet - berada di router yang sama adalah wajib untuk IP lokal dan banyak lagi)
Vinay Bhargav
1
Collin, apa sebenarnya yang Anda maksud dengan 'server tidak menunggu untuk menerima koneksi'? Orang-orang menirukan ini seolah-olah itu berarti sesuatu.
Marquis of Lorne
Saya menulis ini beberapa waktu yang lalu tetapi saya pikir saya maksudkan sebagai cara lain untuk mengatakan Anda belum memulai server Anda.
Harga Collin
dalam kasus saya, saya memiliki empat simulator Gennymotion berjalan dan saya mencoba memuat aplikasi pada tab Galaxy dan saya mendapatkan kesalahan ini. setelah banyak membaca dari sobat WEB, saya kemudian menutup semua simulator dan gerhana, membunuh ADP di task manager dan kemudian memulai kembali Eclipse dan semuanya mulai bekerja dengan baik. Saya pikir ketika Anda memiliki beberapa simulator berjalan dan kemudian Anda mencoba untuk menghubungkan perangkat, ADB menjadi gila dalam pengalaman saya. itu adalah dua sen saya ... :)
Vincy
40

Saya akan memeriksa:

  • Nama host dan port yang Anda coba sambungkan
  • Sisi server telah berhasil mulai mendengarkan dengan benar
  • Tidak ada firewall yang memblokir koneksi

Titik awal paling sederhana adalah mencoba menghubungkan secara manual dari mesin klien menggunakan telnet atau Putty. Jika itu berhasil, maka masalahnya ada di kode klien Anda. Jika tidak, Anda perlu mencari tahu mengapa tidak. Wireshark dapat membantu Anda dalam hal ini.

Jon Skeet
sumber
Terkadang saya mendapatkan pengecualian ini. Ini terjadi untuk periode waktu tertentu. Segera melempar pengecualian ini. Dan kemudian semuanya menjadi baik-baik saja. Saya memiliki firewall di server. Tetapi saya telah menambahkan aturan masuk untuk mengizinkan koneksi masuk pada port 8080. Apakah aturan tersebut kadang-kadang diabaikan?
Ashwin
@Ashwin: Tidak mungkin untuk mengatakan, sungguh - Anda harus mengetahui seberapa jauh data yang didapat. Lihatlah log firewall Anda dll.
Jon Skeet
@ JonSkeet cara mengkonfigurasi firewall kita jika kita memiliki kesalahan ini?
Nikhil Pareek
1
@Nikhil: saya tidak memenuhi syarat untuk menjawab itu, tapi aku tersangka siapa saja yang adalah yang memenuhi syarat akan membutuhkan lebih banyak informasi untuk dapat membantu Anda. (Untuk satu hal, kami tidak tahu apa firewall yang Anda miliki ...)
Jon Skeet
7

Anda harus menghubungkan soket klien Anda ke ServerSocket jarak jauh. Dari pada

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

melakukan

Socket clientSocket = new Socket(serverName, 5000);

Klien harus terhubung ke serverName yang harus cocok dengan nama atau IP kotak tempat Anda ServerSocketdipakai (nama harus dapat dijangkau dari mesin klien). BTW: Bukan nama yang penting, ini semua tentang alamat IP ...

rumah
sumber
Saya berasumsi dia menjalankan keduanya pada mesin yang sama untuk tujuan pengujian yang mengapa localhost akan baik-baik saja untuk digunakan
SE
@ Harun: Dia mengatakan itu berfungsi jika klien dan server berjalan pada mesin yang sama (Anda dapat menemukan jawabannya di komentar lain).
rumah
'Baris di atas mengikat socket ke localhost' Tidak, itu mengikat ke INADDR_ANY. Itu memungkinkannya menerima koneksi melalui NIC apa pun. Apa yang dilakukan OP sudah benar. Jawabannya sepenuhnya salah. Downvoting.
Marquis of Lorne
@ EJP: Anda benar dengan ServerSocket, saya mengubah jawabannya. Namun demikian, clientSocketmasih mencoba untuk terhubung localhost.
rumah
@rumah Anda perlu menghapus frasa tentang alamat bind.
Marquis of Lorne
7

Saya memiliki masalah yang sama, tetapi menjalankan Server sebelum menjalankan Klien memperbaikinya.

Dao Lam
sumber
4
Tentu saja Anda harus menjalankan server sebelum klien. Menjalankan klien terlebih dahulu dan mencoba terhubung ke server berarti Anda terhubung ke ketiadaan ketika Anda menjalankan server Anda.
user3308043
5
@ user3308043 Ya itu jelas tapi itu tidak terlalu jelas untuk beberapa programmer baru (seperti saya 3 tahun yang lalu) jadi saya hanya ingin membaginya dengan orang-orang yang tidak mengerti seperti saya.
Dao Lam
Terima kasih, ini juga membantu saya, koneksi tes berhasil tetapi tidak dapat menampilkan data tabel.
Damien Christophe
6

Satu hal yang ingin saya tambahkan ke jawaban di atas adalah pengalaman saya -

"Saya meng-host di server saya di localhost dan mencoba menghubungkannya melalui emulator android dengan menentukan URL yang tepat seperti http://localhost/my_api/login.php. Dan saya mendapat koneksi yang menolak kesalahan "

Point to note - Ketika saya baru saja pergi ke browser di PC dan menggunakan URL yang sama ( http://localhost/my_api/login.php) saya mendapatkan respons yang benar

jadi Masalah dalam kasus saya adalah istilah localhostyang saya ganti dengan IP untuk server saya (karena server Anda di-host pada mesin Anda) yang membuatnya dapat dijangkau dari emulator saya pada PC yang sama.


Untuk mendapatkan IP untuk mesin lokal Anda, Anda dapat menggunakan ipconfigperintah pada cmd Anda akan mendapatkan IPv4 sesuatu seperti 192.68.xx.yy Voila ..itu IP mesin Anda di mana Anda memiliki host server Anda. gunakan itu daripada localhost

http://192.168.72.66/my_api/login.php


Catatan - Anda tidak akan dapat mencapai IP pribadi ini dari simpul apa pun di luar komputer ini. (Jika perlu, Anda dapat menggunakan Ngnix untuk itu)

eRaisedToX
sumber
4

Saya memiliki masalah yang sama dengan broker Mqtt bernama vernemq.but diselesaikan dengan menambahkan yang berikut ini.

  1. $ sudo vmq-admin listener show

untuk menampilkan daftar o ips dan port yang diizinkan untuk vernemq

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

untuk menambahkan ip dan port baru Anda. sekarang kamu harus dapat terhubung tanpa masalah.

Semoga ini bisa menyelesaikan masalah Anda. masukkan deskripsi gambar di sini

Tuannyancha
sumber
1
Ini menyelamatkan hari saya, tetapi karena vernemq tidak diinstal dengan apt-get, beberapa orang akan memerlukan tautan ini: vernemq.com/docs/installation/debian_and_ubuntu.html
Damir Olejar
2

Semoga pengalaman saya dapat bermanfaat bagi seseorang. Saya menghadapi masalah dengan jejak stack pengecualian yang sama dan saya tidak bisa memahami apa masalahnya. Server Database yang saya coba hubungkan sedang berjalan dan port terbuka dan menerima koneksi.

Masalahnya adalah dengan koneksi internet. Koneksi internet yang saya gunakan tidak diizinkan untuk terhubung ke server yang sesuai. Ketika saya mengubah detail koneksi, masalah terselesaikan.

phoenix
sumber
1

Dalam kasus saya, saya memberi socket nama server (dalam kasus saya "raspberrypi"), dan sebagai gantinya alamat IPv4 membuatnya, atau untuk menentukan, IPv6 rusak (nama diputuskan menjadi IPv6)

Zhyano
sumber
1

Dalam kasus saya, saya harus meletakkan tanda centang Expose daemon on tcp://localhost:2375 without TLSdi dekat dockerpengaturan (di sisi kanan bilah tugas, klik kanan docker, pilih setting)

pengguna1419243
sumber
1

saya mendapatkan kesalahan ini karena saya menutup ServerSocket di dalam for loop yang mencoba menerima jumlah klien di dalamnya (saya belum selesai menerima semua clints)

jadi berhati-hatilah di mana harus menutup Socket Anda

Basheer AL-MOMANI
sumber
0

Saya memiliki masalah yang sama dan masalahnya adalah saya tidak menutup objek socket. Setelah menggunakan socket.close (); masalah terpecahkan. Kode ini berfungsi untuk saya.

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

dan 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
sumber
1
Tidak menutup soket klien tidak menyebabkan penolakan koneksi. Tidak akan ada soket klien untuk ditutup jika koneksi ditolak.
Marquis of Lorne
0

Saya mengubah jaringan DNS saya dan itu memperbaiki masalah

Eli Nb
sumber
-2

Saya memiliki masalah yang sama, dan ternyata karena izin catalina.outfile tidak benar. Itu tidak dapat ditulis oleh pengguna kucing jantan. Setelah saya memperbaiki izin, masalah terselesaikan. Saya mengetahui bahwa ini adalah masalah izin dari log di tomcat8-initd.logfile:

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

kbsbng
sumber
1
'Izin ditolak' tidak sama dengan 'koneksi ditolak'.
Marquis of Lorne
Kesalahan yang ditolak izin ada di tomcat8-initd.logfile sementara output log server memiliki kesalahan yang disebutkan dalam pertanyaan.
kbsbng
-3

Bisa jadi ada contoh sebelumnya dari klien masih berjalan dan mendengarkan pada port 5000.

Michael Munsey
sumber
6
Klien tidak mendengarkan. Mereka berbicara.
Raedwald
Contoh sebelumnya akan menyebabkan a BindExceptiondi server, bukan ConnectExceptiondi klien.
Marquis of Lorne