java.net.ConnectException: Kết nối bị từ chối


186

Tôi đang cố gắng thực hiện kết nối TCP, mọi thứ đều hoạt động tốt từ phía máy chủ nhưng khi tôi chạy chương trình máy khách (từ máy khách) thì tôi gặp lỗi sau:

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)

Tôi đã thử thay đổi số ổ cắm trong trường hợp nó đang được sử dụng nhưng không có kết quả, có ai biết nguyên nhân gây ra lỗi này không và cách khắc phục.

Mã máy chủ:

//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ã khách hàng:

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

Bạn có thể vui lòng gửi mã khách hàng? Nếu đó là máy khách từ xa, hãy đảm bảo bạn không gặp vấn đề về tường lửa!
nhà

Tôi đã tắt tường lửa trên cả máy khách và máy chủ và vẫn gặp sự cố
Samantha Catania

2
Giao diện nào là máy chủ lắng nghe. Nếu bạn chỉ nghe trên localhost, bạn không thể kết nối từ xa.
Thorbjørn Ravn Andersen

Tôi đã cố gắng kết nối từ xa trong khi sử dụng localhost, mặt cọ. Đây là bản dùng thử đầu tiên của tôi với TCP>. <Làm cách nào để tôi làm cho nó hoạt động từ xa?
Samantha Catania

Hãy nhớ rằng bạn cũng có thể có một số tường lửa phần cứng 'kim loại trần' ở giữa ... nó có hoạt động không nếu máy khách và máy chủ nằm trên cùng một hộp?
nhà

Câu trả lời:


323

Ngoại lệ này có nghĩa là không có dịch vụ lắng nghe trên IP / cổng mà bạn đang cố gắng kết nối với:

  • Bạn đang cố gắng kết nối với IP / Host hoặc cổng sai.
  • Bạn chưa bắt đầu máy chủ của bạn.
  • Máy chủ của bạn không lắng nghe các kết nối.
  • Trên các máy chủ Windows, hàng đợi tồn đọng nghe đã đầy.

52
Tôi cảm thấy ngớ ngẩn vì đã bỏ qua You have not started your server, nhưng đó thực sự là vấn đề đối với tôi!
Alexis Leclerc

Chỉ cần làm rõ quan điểm - "Lõi Java là tốt". Vấn đề duy nhất là chúng ta bỏ qua các vấn đề .. (trạng thái máy chủ, ipaddress, cổng, kết nối internet - phải trên cùng một bộ định tuyến đối với IP cục bộ và hơn thế nữa)
Vinay Bhargav

1
Collin, chính xác ý bạn là gì khi 'máy chủ không chờ đợi để chấp nhận kết nối'? Mọi người đang vẹt cái này xung quanh như thể nó có ý nghĩa gì đó.
Hầu tước Lorne

Tôi đã viết điều này một thời gian trước đây nhưng tôi nghĩ tôi có ý đó như một cách khác để nói rằng bạn chưa khởi động máy chủ của mình.
Giá Collin

trong trường hợp của tôi, tôi có bốn trình giả lập Gennymotion đang chạy và tôi đang cố tải ứng dụng trên tab Galaxy và tôi đã gặp lỗi này. Sau khi đọc rất nhiều từ WEB bạn bè, tôi đã đóng tất cả các trình giả lập và nhật thực, giết ADP trong trình quản lý tác vụ và sau đó khởi động lại Eclipse và mọi thứ bắt đầu hoạt động bình thường. Tôi nghĩ rằng khi bạn có nhiều trình giả lập đang chạy và sau đó bạn cố gắng kết nối thiết bị, ADB sẽ hoạt động theo kinh nghiệm của tôi. đó là hai xu của tôi ... :)
Vincy

40

Tôi sẽ kiểm tra:

  • Tên máy chủ và cổng bạn đang cố gắng kết nối với
  • Phía máy chủ đã quản lý để bắt đầu nghe chính xác
  • Không có tường lửa chặn kết nối

Điểm khởi đầu đơn giản nhất có lẽ là cố gắng kết nối thủ công từ máy khách bằng telnet hoặc Putty. Nếu điều đó thành công, thì vấn đề nằm ở mã máy khách của bạn. Nếu không, bạn cần tìm hiểu lý do tại sao không. Wireshark có thể giúp bạn trên mặt trận này.


Đôi khi tôi nhận được ngoại lệ này. Điều này xảy ra trong một khoảng thời gian cụ thể. Nó ngay lập tức ném ngoại lệ này. Và rồi mọi thứ trở nên tốt đẹp. Tôi có một tường lửa trong máy chủ. Nhưng tôi đã thêm một quy tắc gửi đến để cho phép các kết nối đến trên cổng 8080. Đôi khi quy tắc có bị bỏ qua không?
Ashwin

@Ashwin: Thật không thể nói, thực sự - bạn cần tìm ra chính xác khoảng cách dữ liệu nhận được. Nhìn vào nhật ký tường lửa của bạn, v.v.
Jon Skeet

@JonSkeet làm thế nào để cấu hình tường lửa của chúng tôi nếu chúng tôi gặp lỗi này?
Nikhil Pareek

1
@Nikhil: Tôi không đủ điều kiện để trả lời đó, nhưng tôi nghi ngờ bất cứ ai đủ tiêu chuẩn sẽ cần nhiều thông tin hơn để có thể giúp bạn. (Vì một điều, chúng tôi không biết bạn có tường lửa nào ...)
Jon Skeet

7

Bạn phải kết nối ổ cắm máy khách của mình với ServerSocket từ xa. Thay vì

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

làm

Socket clientSocket = new Socket(serverName, 5000);

Khách hàng phải kết nối với serverName mà phải phù hợp với tên hoặc IP của hộp mà bạn ServerSocketđã khởi tạo (tên phải truy cập từ các máy client). BTW: Đây không phải là cái tên quan trọng, tất cả là về địa chỉ IP ...


Tôi giả sử cô ấy đang chạy cả hai trên cùng một máy cho mục đích thử nghiệm, đó là lý do tại sao localhost sẽ sử dụng tốt
SE

@Aaron: Cô ấy nói nó hoạt động nếu máy khách và máy chủ chạy trên cùng một máy (bạn có thể tìm thấy câu trả lời trong một bình luận khác).
nhà

'Hàng trên liên kết ổ cắm với localhost' Không, nó không liên kết với INADDR_ANY. Điều đó cho phép nó chấp nhận các kết nối thông qua bất kỳ NIC. Những gì OP đang làm là đã đúng. Trả lời là hoàn toàn không chính xác. Hạ cấp.
Hầu tước Lorne

@EJP: Bạn nói đúng ServerSocket, tôi đã sửa đổi câu trả lời. Tuy nhiên, clientSocketvẫn cố gắng để kết nối localhost.
nhà

@home Bạn cần xóa cụm từ về địa chỉ liên kết.
Hầu tước Lorne

7

Tôi gặp vấn đề tương tự, nhưng chạy Máy chủ trước khi chạy Máy khách đã sửa nó.


4
Tất nhiên bạn phải chạy máy chủ trước máy khách. Chạy máy khách trước và cố gắng kết nối với máy chủ nghĩa là bạn đang kết nối với không có gì khi bạn khởi động máy chủ của mình.
3308043

5
@ user3308043 Vâng, điều đó là hiển nhiên nhưng nó không quá rõ ràng đối với một số lập trình viên mới (như bản thân tôi 3 năm trước) vì vậy tôi chỉ muốn chia sẻ nó với những người không biết gì như tôi.
Đào Lâm

Cảm ơn, nó cũng giúp tôi, kết nối thử nghiệm rất thành công nhưng không thể hiển thị bất kỳ dữ liệu bảng nào.
Damien

6

Một điểm mà tôi muốn thêm vào các câu trả lời ở trên là kinh nghiệm của tôi -

"Tôi đã lưu trữ trên máy chủ của mình trên localhost và đang cố gắng kết nối với nó thông qua trình giả lập Android bằng cách chỉ định URL thích hợp http://localhost/my_api/login.php. Và tôi đã nhận được lỗi từ chối kết nối "

Điểm cần lưu ý - Khi tôi vừa truy cập trình duyệt trên PC và sử dụng cùng một URL ( http://localhost/my_api/login.php) tôi đã nhận được phản hồi chính xác

Vì vậy, Vấn đề trong trường hợp của tôi là thuật ngữ localhostmà tôi đã thay thế bằng IP cho máy chủ của mình (vì máy chủ của bạn được lưu trữ trên máy của bạn) khiến nó có thể truy cập được từ trình giả lập của tôi trên cùng một PC.


Để nhận IP cho máy cục bộ của bạn, bạn có thể sử dụng ipconfiglệnh trên cmd, bạn sẽ nhận được IPv4 giống như 192,68.xx.yy Voila .. đó là IP máy của bạn nơi bạn có máy chủ được lưu trữ. sử dụng nó sau đó thay vì localhost

http://192.168.72.66/my_api/login.php


Lưu ý - bạn sẽ không thể truy cập IP riêng này từ bất kỳ nút nào bên ngoài máy tính này. (Trong trường hợp bạn cần, bạn có thể sử dụng Ngnix cho việc đó)


4

Tôi đã có cùng một vấn đề với nhà môi giới Mqtt được gọi là vernemq.but đã giải quyết nó bằng cách thêm vào như sau.

  1. $ sudo vmq-admin listener show

để hiển thị danh sách o cho phép ips và cổng cho vernemq

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

để thêm bất kỳ ip và cổng mới của bạn. bây giờ bạn sẽ có thể kết nối mà không có bất kỳ vấn đề.

Hy vọng nó giải quyết vấn đề của bạn. nhập mô tả hình ảnh ở đây


1
Điều này đã tiết kiệm thời gian của tôi, nhưng vì vernemq không cài đặt với apt-get, một số người sẽ cần liên kết này: vernemq.com/docs/installation/debian_and_ubfox.html
Damir Olejar

2

Hy vọng kinh nghiệm của tôi có thể hữu ích cho ai đó. Tôi đã đối mặt với vấn đề với cùng dấu vết ngăn xếp ngoại lệ và tôi không thể hiểu vấn đề là gì. Máy chủ cơ sở dữ liệu mà tôi đang cố gắng kết nối đang chạy và cổng đã mở và đang chấp nhận kết nối.

Vấn đề là kết nối internet. Kết nối internet mà tôi đang sử dụng không được phép kết nối với máy chủ tương ứng. Khi tôi thay đổi chi tiết kết nối, vấn đề đã được giải quyết.


1

Trong trường hợp của tôi, tôi đã đặt cho socket của tên máy chủ (trong trường hợp của tôi là "raspberrypi") và thay vào đó, một địa chỉ IPv4 đã tạo ra nó, hoặc để chỉ định, IPv6 đã bị hỏng (tên được phân giải thành IPv6)


1

Trong trường hợp của tôi, tôi phải đặt một dấu kiểm gần Expose daemon on tcp://localhost:2375 without TLStrong dockercài đặt (ở bên phải của thanh tác vụ, nhấp chuột phải vào docker, chọn setting)


1

tôi gặp lỗi này vì tôi đã đóng ServerSocket trong một vòng lặp for cố gắng chấp nhận số lượng khách hàng bên trong nó (tôi đã không chấp nhận tất cả các gợi ý)

Vì vậy, hãy cẩn thận nơi đóng ổ cắm của bạn


0

Tôi đã có cùng một vấn đề và vấn đề là tôi đã không đóng đối tượng socket. Sau khi sử dụng socket.close (); Vấn đề được giải quyết. Mã này làm việc cho tôi.

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

và 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
Không đóng ổ cắm máy khách không gây ra sự từ chối kết nối. Sẽ không ổ cắm máy khách để đóng nếu kết nối bị từ chối.
Hầu tước Lorne

0

Tôi đã thay đổi mạng DNS của mình và nó đã khắc phục sự cố


-2

Tôi đã có cùng một vấn đề, và hóa ra là do sự cho phép của catalina.outtập tin không chính xác. Nó không thể ghi được bởi người dùng tomcat. Khi tôi sửa các quyền, vấn đề đã được giải quyết. Tôi đã biết rằng đó là một vấn đề quyền từ các bản ghi trong tomcat8-initd.logtệp:

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


1
'Quyền bị từ chối' không giống như 'kết nối bị từ chối'.
Hầu tước Lorne

Lỗi từ chối quyền là trong tomcat8-initd.logtệp trong khi nhật ký đầu ra của máy chủ có chính xác lỗi được đề cập trong câu hỏi.
kbsbng

-3

Có thể có một phiên bản trước đó của máy khách vẫn đang chạy và nghe trên cổng 5000.


6
Khách hàng không nghe. Họ nói.
Raedwald

Một trường hợp trước đó sẽ gây ra một BindExceptionmáy chủ, không phải ConnectExceptiontại máy khách.
Hầu tước Lorne
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.