java.net.ConnectException: การเชื่อมต่อถูกปฏิเสธ


186

ฉันพยายามใช้การเชื่อมต่อ TCP ทุกอย่างทำงานได้ดีจากฝั่งเซิร์ฟเวอร์ แต่เมื่อฉันเรียกใช้โปรแกรมไคลเอนต์ (จากคอมพิวเตอร์ไคลเอนต์) ฉันได้รับข้อผิดพลาดต่อไปนี้:

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)

ฉันพยายามเปลี่ยนหมายเลขซ็อกเก็ตในกรณีที่ใช้งานอยู่ แต่ไม่มีประโยชน์ใครจะรู้ว่าอะไรเป็นสาเหตุของข้อผิดพลาดนี้ & วิธีแก้ไข

รหัสเซิร์ฟเวอร์:

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

            }

        }
    }
}

รหัสลูกค้า:

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

คุณช่วยกรุณาโพสต์รหัสลูกค้าได้ไหม? หากเป็นไคลเอนต์ระยะไกลตรวจสอบให้แน่ใจว่าคุณไม่มีปัญหาไฟร์วอลล์!
home

ฉันปิดไฟร์วอลล์บนไคลเอนต์ & เซิร์ฟเวอร์ & ยังคงมีปัญหาเดียวกัน
Samantha Catania

2
ส่วนต่อประสานใดที่เซิร์ฟเวอร์กำลังรับฟัง หากคุณกำลังฟังบน localhost เท่านั้นคุณไม่สามารถเชื่อมต่อจากระยะไกลได้
Thorbjørn Ravn Andersen

ฉันพยายามเชื่อมต่อจากระยะไกลในขณะที่ใช้ localhost อยู่หน้าตามือ นี่คือการทดลองครั้งแรกของฉันกับ TCP> <ฉันจะทำให้มันทำงานจากระยะไกลได้อย่างไร
Samantha Catania

จำไว้ว่าคุณอาจมีไฟร์วอลล์ฮาร์ดแวร์ 'โลหะเปลือย' อยู่ด้วยเช่นกัน ... มันทำงานอย่างไรถ้าไคลเอนต์และเซิร์ฟเวอร์อยู่ในกล่องเดียวกัน?
home

คำตอบ:


323

ข้อยกเว้นนี้หมายความว่าไม่มีบริการฟังบน IP / พอร์ตที่คุณพยายามเชื่อมต่อ:

  • คุณกำลังพยายามเชื่อมต่อกับ IP / โฮสต์หรือพอร์ตที่ไม่ถูกต้อง
  • คุณยังไม่ได้เริ่มเซิร์ฟเวอร์
  • เซิร์ฟเวอร์ของคุณไม่รับฟังการเชื่อมต่อ
  • บนเซิร์ฟเวอร์ Windows คิวการค้างงานฟังเต็ม

52
ฉันรู้สึกโง่ที่มองข้ามYou have not started your serverแต่มันเป็นปัญหาสำหรับฉันจริงๆ!
Alexis Leclerc

เพียงเพื่อให้จุดชัดเจน - "Java core นั้นดี" ปัญหาเดียวคือเรามองข้ามปัญหา .. (สถานะเซิร์ฟเวอร์, ipaddress, พอร์ต, การเชื่อมต่ออินเทอร์เน็ต - การอยู่บนเราเตอร์เดียวกันนั้นจำเป็นสำหรับ IP ของท้องถิ่นและอื่น ๆ )
Vinay Bhargav

1
Collin คุณหมายถึงอะไรโดย 'เซิร์ฟเวอร์ไม่รอรับการเชื่อมต่อ' ผู้คนกำลังแหย่สิ่งนี้รอบ ๆ ราวกับว่ามันมีความหมายอะไรบางอย่าง
มาร์ควิสแห่ง Lorne

ฉันเคยเขียนสิ่งนี้มาแล้ว แต่ฉันคิดว่าฉันหมายความว่ามันเป็นอีกวิธีหนึ่งในการบอกว่าคุณยังไม่ได้เริ่มต้นเซิร์ฟเวอร์ของคุณ
Collin ราคา

ในกรณีของฉันฉันมีตัวจำลอง Gennymotion สี่ตัวที่ทำงานอยู่และฉันพยายามโหลดแอปบนแท็บ Galaxy และฉันได้รับข้อผิดพลาดนี้ หลังจากอ่านมากจากเว็บเพื่อนฉันก็ปิดตัวจำลองและคราสทั้งหมดฆ่า ADP ในตัวจัดการงานจากนั้นรีสตาร์ท Eclipse และทุกอย่างก็เริ่มทำงานอย่างถูกต้อง ฉันคิดว่าเมื่อคุณมีตัวจำลองหลายตัวที่ทำงานอยู่และจากนั้นคุณพยายามเชื่อมต่ออุปกรณ์ ADB ก็เข้าสู่ประสบการณ์ของฉัน นี่คือสองเซ็นต์ของฉัน ... :)
Vincy

40

ฉันจะตรวจสอบ:

  • ชื่อโฮสต์และพอร์ตที่คุณพยายามเชื่อมต่อ
  • ฝั่งเซิร์ฟเวอร์มีการจัดการเพื่อเริ่มฟังอย่างถูกต้อง
  • ไม่มีไฟร์วอลล์บล็อกการเชื่อมต่อ

จุดเริ่มต้นที่ง่ายที่สุดน่าจะลองเชื่อมต่อด้วยตนเองจากเครื่องไคลเอ็นต์โดยใช้ telnet หรือ Putty หากประสบความสำเร็จแสดงว่าปัญหาอยู่ในรหัสลูกค้าของคุณ หากไม่เป็นเช่นนั้นคุณต้องคิดออกว่าทำไมมันถึงไม่เป็นเช่นนั้น Wiresharkอาจช่วยคุณในหน้านี้


บางครั้งฉันได้รับข้อยกเว้นนี้ สิ่งนี้เกิดขึ้นในช่วงเวลาหนึ่ง มันจะโยนข้อยกเว้นนี้ทันที แล้วทุกอย่างก็จะเรียบร้อย ฉันมีไฟร์วอลล์ในเซิร์ฟเวอร์ แต่ฉันได้เพิ่มกฎขาเข้าเพื่ออนุญาตการเชื่อมต่อขาเข้าบนพอร์ต 8080 กฎบางอย่างถูกละเว้นหรือไม่?
Ashwin

@Ashwin: มันเป็นไปไม่ได้ที่จะพูดจริง ๆ - คุณต้องคิดให้ถ่องแท้ ดูบันทึกไฟร์วอลล์ของคุณเป็นต้น
Jon Skeet

@JonSkeet วิธีการตั้งค่าไฟร์วอลล์ของเราหากเรามีข้อผิดพลาดนี้?
Nikhil Pareek

1
@ นิคิล: ฉันไม่มีคุณสมบัติที่จะตอบคำถามนี้ แต่ฉันสงสัยว่าใครก็ตามที่มีคุณสมบัติจะต้องมีข้อมูลอีกมากเพื่อให้สามารถช่วยเหลือคุณได้ (สำหรับสิ่งหนึ่งเราไม่ทราบว่าคุณมีไฟร์วอลล์ ... )
Jon Skeet

7

คุณต้องเชื่อมต่อซ็อกเก็ตไคลเอ็นต์ของคุณกับ ServerSocket ระยะไกล แทน

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

ทำ

Socket clientSocket = new Socket(serverName, 5000);

ไคลเอ็นต์ต้องเชื่อมต่อกับserverNameซึ่งควรตรงกับชื่อหรือ IP ของกล่องที่คุณServerSocketถูกสร้างอินสแตนซ์ (ชื่อจะต้องสามารถเข้าถึงได้จากเครื่องไคลเอนต์) BTW: ไม่ใช่ชื่อที่สำคัญทั้งหมดเกี่ยวกับที่อยู่ IP ...


ฉันคิดว่าเธอกำลังเรียกใช้พวกเขาทั้งสองบนเครื่องเดียวกันสำหรับวัตถุประสงค์ในการทดสอบซึ่งเป็นสาเหตุที่ localhost จะใช้งานได้ดี
SE

@Aaron: เธอบอกว่ามันทำงานได้ถ้าไคลเอนต์และเซิร์ฟเวอร์ทำงานบนเครื่องเดียวกัน (คุณสามารถหาคำตอบในความคิดเห็นอื่น)
home

'แถวด้านบนผูกซ็อกเก็ตกับ localhost' ไม่มันไม่ได้ผูกเข้ากับ INADDR_ANY ที่อนุญาตให้ยอมรับการเชื่อมต่อผ่าน NIC ใด ๆ สิ่งที่ OP กำลังทำอยู่นั้นถูกต้องแล้ว คำตอบไม่ถูกต้องสมบูรณ์ downvoting
มาร์ควิสแห่ง Lorne

@EJP: คุณพูดถูกServerSocketฉันปรับเปลี่ยนคำตอบ อย่างไรก็ตามยังคงพยายามที่จะเชื่อมต่อไปยังclientSocket localhost
home

@home คุณต้องลบวลีเกี่ยวกับที่อยู่ผูก
มาร์ควิสแห่ง Lorne

7

ฉันมีปัญหาเดียวกัน แต่การเรียกใช้เซิร์ฟเวอร์ก่อนเรียกใช้ไคลเอ็นต์จะแก้ไข


4
แน่นอนคุณต้องเรียกใช้เซิร์ฟเวอร์ก่อนไคลเอนต์ เรียกใช้ไคลเอนต์ก่อนและพยายามเชื่อมต่อกับเซิร์ฟเวอร์หมายความว่าคุณกำลังเชื่อมต่อกับอะไรเมื่อคุณไฟเซิร์ฟเวอร์ของคุณ
user3308043

5
@ user3308043 ใช่มันชัดเจน แต่ก็ไม่ชัดเจนเกินไปสำหรับโปรแกรมเมอร์ใหม่บางคน (เหมือนตัวเองเมื่อ 3 ปีก่อน) ดังนั้นฉันแค่อยากจะแบ่งปันมันกับเพื่อนที่เป็นคนขี้เกียจเหมือนฉัน
Dao Lam

ขอบคุณมันช่วยฉันได้เช่นกันการเชื่อมต่อการทดสอบประสบความสำเร็จ แต่ไม่สามารถแสดงข้อมูลตารางใด ๆ ได้
ดาเมียน Christophe

6

จุดหนึ่งที่ฉันอยากจะเพิ่มคำตอบข้างต้นคือประสบการณ์ของฉัน -

"ฉันโฮสต์บนเซิร์ฟเวอร์ของฉันบนlocalhostและพยายามเชื่อมต่อผ่านทางโปรแกรมจำลอง androidโดยระบุ URL ที่เหมาะสมเช่นhttp://localhost/my_api/login.phpนั้นและฉันได้รับการเชื่อมต่อถูกปฏิเสธข้อผิดพลาด "

ชี้ให้เห็น -เมื่อฉันเพิ่งไปที่เบราว์เซอร์บนพีซีและใช้ URL เดียวกัน ( http://localhost/my_api/login.php) ฉันได้รับการตอบสนองที่ถูกต้อง

ดังนั้นปัญหาในกรณีของฉันคือคำlocalhostที่ฉันแทนที่ด้วยIPสำหรับเซิร์ฟเวอร์ของฉัน (เนื่องจากเซิร์ฟเวอร์ของคุณโฮสต์บนเครื่องของคุณ) ซึ่งทำให้สามารถเข้าถึงได้จากตัวจำลองของฉันบนพีซีเครื่องเดียวกัน


ในการรับ IP สำหรับเครื่องท้องถิ่นของคุณคุณสามารถใช้ipconfigคำสั่งบน cmd คุณจะได้รับ IPv4 เช่น 192.68.xx.yy Voila .. นั่นคือ IP ของเครื่องที่คุณโฮสต์เซิร์ฟเวอร์ของคุณ ใช้มันแทน localhost

http://192.168.72.66/my_api/login.php


หมายเหตุ - คุณจะไม่สามารถเข้าถึง IP ส่วนตัวนี้จากโหนดใด ๆ นอกคอมพิวเตอร์นี้ (ในกรณีที่คุณต้องการคุณสามารถใช้ Ngnix ได้)


4

ฉันมีปัญหาเดียวกันกับโบรกเกอร์ Mqtt ชื่อ vernemq.but แก้ไขได้โดยเพิ่มสิ่งต่อไปนี้

  1. $ sudo vmq-admin listener show

เพื่อแสดงรายการ o ips และพอร์ตที่อนุญาตสำหรับ vernemq

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

เพื่อเพิ่ม ip และพอร์ตใหม่ของคุณ ตอนนี้คุณน่าจะสามารถเชื่อมต่อได้โดยไม่มีปัญหาใด ๆ

หวังว่ามันจะช่วยแก้ปัญหาของคุณ ป้อนคำอธิบายรูปภาพที่นี่


1
ที่บันทึกไว้นี้วันของฉัน แต่เนื่องจาก vernemq ไม่ได้ติดตั้งกับ apt-get บางคนจะต้องลิงค์นี้: vernemq.com/docs/installation/debian_and_ubuntu.html
Damir Olejar

2

หวังว่าประสบการณ์ของฉันอาจเป็นประโยชน์กับใครบางคน ฉันประสบปัญหาด้วยการติดตามสแต็กข้อยกเว้นเดียวกันและฉันไม่เข้าใจว่าปัญหาคืออะไร เซิร์ฟเวอร์ฐานข้อมูลที่ฉันพยายามเชื่อมต่อกำลังทำงานอยู่และพอร์ตเปิดอยู่และกำลังรับการเชื่อมต่อ

ปัญหานี้เกิดจากการเชื่อมต่ออินเทอร์เน็ต การเชื่อมต่ออินเทอร์เน็ตที่ฉันใช้ไม่ได้รับอนุญาตให้เชื่อมต่อกับเซิร์ฟเวอร์ที่เกี่ยวข้อง เมื่อฉันเปลี่ยนรายละเอียดการเชื่อมต่อปัญหาได้รับการแก้ไข


1

ในกรณีของฉันฉันให้ซ็อกเก็ตชื่อของเซิร์ฟเวอร์ (ในกรณีของฉัน "raspberrypi") และแทนที่จะเป็นที่อยู่ IPv4 ที่สร้างขึ้นหรือเพื่อระบุว่า IPv6 ใช้งานไม่ได้ (ชื่อถูกแก้ไขเป็น IPv6)


1

ในกรณีของฉันฉันมีที่จะนำเครื่องหมายที่อยู่ใกล้Expose daemon on tcp://localhost:2375 without TLSในdockerการตั้งค่า (บนด้านขวาของแถบงานคลิกขวาที่dockerเลือกsetting)


1

ฉันได้รับข้อผิดพลาดนี้เพราะฉันปิด ServerSocketภายในสำหรับลูปที่พยายามยอมรับจำนวนลูกค้าที่อยู่ข้างใน (ฉันไม่ยอมรับ clints ทั้งหมด)

ดังนั้นระวังที่จะปิดซ็อกเก็ตของคุณ


0

ฉันมีปัญหาเดียวกันและปัญหาคือว่าฉันไม่ได้ปิดวัตถุซ็อกเก็ตหลังจากใช้ socket.close (); แก้ไขปัญหา. รหัสนี้ใช้ได้สำหรับฉัน

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

และ 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
ไม่ปิดซ็อกเก็ตไคลเอนต์ไม่ทำให้เกิดการปฏิเสธการเชื่อมต่อ มีจะไม่เป็นซ็อกเก็ตลูกค้าใกล้ชิดหากการเชื่อมต่อที่ได้รับการปฏิเสธ
มาร์ควิสแห่ง Lorne


-2

ฉันมีปัญหาเดียวกันและปรากฎว่าเป็นเพราะการอนุญาตของcatalina.outไฟล์ไม่ถูกต้อง มันไม่สามารถเขียนได้โดยผู้ใช้โพง เมื่อฉันแก้ไขสิทธิ์แล้วปัญหาก็จะได้รับการแก้ไข ฉันได้รู้ว่ามันเป็นปัญหาสิทธิ์จากบันทึกในtomcat8-initd.logไฟล์:

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


1
'การอนุญาตที่ถูกปฏิเสธ' ไม่ใช่สิ่งเดียวกันกับ 'การเชื่อมต่อถูกปฏิเสธ'
มาร์ควิสแห่ง Lorne

ข้อผิดพลาดการอนุญาตถูกปฏิเสธอยู่ในtomcat8-initd.logไฟล์ในขณะที่บันทึกผลลัพธ์เซิร์ฟเวอร์มีข้อผิดพลาดที่กล่าวถึงในคำถาม
kbsbng

-3

อาจเป็นไปได้ว่ามีอินสแตนซ์ก่อนหน้านี้ของไคลเอ็นต์ที่ยังคงทำงานและฟังพอร์ต 5000


6
ลูกค้าไม่ฟัง พวกเขาคุยกัน
Raedwald

อินสแตนซ์ก่อนหน้านี้จะทำให้BindExceptionเซิร์ฟเวอร์ที่ไม่ใช่ConnectExceptionลูกค้า
มาร์ควิสแห่ง Lorne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.