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

クライアントコードを投稿していただけますか?リモートクライアントの場合は、ファイアウォールの問題がないことを確認してください。
ホーム

クライアントとサーバーの両方でファイアウォールをオフにしましたが、それでも同じ問題が発生しました
サマンサカタニア

2
サーバーがリッスンしているインターフェース。ローカルホストでのみリッスンしている場合、リモートで接続することはできません。
するThorbjörnRavnアンデルセン

ローカルホスト、顔の手のひらを使用してリモート接続を試みました。これは、TCPを使用した最初の試用版です。<リモートで動作させるにはどうすればよいですか?
サマンサカタニア

その間にいくつかの「ベアメタル」ハードウェアファイアウォールが存在する可能性があることを覚えておいてください...クライアントとサーバーが同じボックス上にある場合は機能しますか?
ホーム

回答:


323

この例外は、接続しようとしているIP /ポートでリッスンしているサービスがないことを意味します。

  • 間違ったIP /ホストまたはポートに接続しようとしています。
  • サーバーを起動していません。
  • サーバーは接続を待機していません。
  • Windowsサーバーでは、listen backlogキューがいっぱいです。

52
を見落としたのは私には馬鹿げていると思うYou have not started your serverが、それは本当に私にとって問題だった!
Alexis Leclerc

要点を明確にするために-「Javaコアは問題ない」唯一の問題は、私たちが問題を見落としていることです。(サーバーの状態、ipaddress、ポート、インターネット接続-ローカルIPと同じルーター上にあることが必要です)
Vinay Bhargav

1
コリン、「サーバーが接続を受け入れるのを待っていない」とはどういう意味ですか?人々は、それが何かを意味するかのように、周りでオウムを回しています。
ローン侯爵

これは少し前に書いたものですが、サーバーをまだ起動していないという別の言い方をしたと思います。
コリン価格

私の場合、4つのGennymotionシミュレーターを実行していて、アプリをGalaxyタブにロードしようとしていて、このエラーが発生しました。バディWEBからたくさん読んだ後、すべてのシミュレーターと日食を閉じ、タスクマネージャーでADPを強制終了し、Eclipseを再起動すると、すべてが正常に動作し始めました。複数のシミュレーターを実行しているときにデバイスを接続しようとすると、ADBが私の経験で大問題になると思います。それらは私の2セントです... :)
Vincy

40

私はチェックします:

  • 接続しようとしているホスト名とポート
  • サーバー側は正しくリスニングを開始することができました
  • 接続をブロックするファイアウォールはありません

最も簡単な開始点は、おそらくtelnetまたはPuttyを使用してクライアントマシンから手動で接続することです。それが成功する場合、問題はクライアントコードにあります。表示されない場合は、表示されない理由を調べる必要があります。Wiresharkがこの面で役立ちます。


この例外が時々発生します。これは特定の期間発生します。この例外はすぐにスローされます。そして、すべてがうまくなります。サーバーにファイアウォールがあります。しかし、ポート8080での着信接続を許可する受信ルールを追加しました。ルールは無視されることがありますか?
Ashwin 2012

@Ashwin:言うことは実際には不可能です-データがどこまで到達しているか正確に計算する必要があります。ファイアウォールのログなどを見てください
Jon Skeet

@JonSkeetこのエラーが発生した場合にファイアウォールを構成する方法は?
Nikhil Pareek、

1
@Nikhil:私はそれに答える資格がありませんが、資格がある人あなたを助けるためにもっと多くの情報が必要になると思います。(1つには、使用しているファイアウォールがわからない...)
Jon Skeet '19年

7

クライアントのソケットをリモートのServerSocketに接続する必要があります。の代わりに

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

行う

Socket clientSocket = new Socket(serverName, 5000);

クライアントは、インスタンス化されたボックスの名前またはIPと一致するserverNameに接続する必要ServerSocketがあります(名前はクライアントマシンから到達可能でなければなりません)。ところで、重要なのは名前ではなく、すべてIPアドレスについてです...


私は彼女がテスト目的で同じマシン上で両方を実行していると思います。そのため、localhostを使用しても問題はありません
SE

@Aaron:彼女は、クライアントとサーバーが同じマシンで実行されている場合は機能すると述べました(別のコメントで答えを見つけることができます)。
ホーム

「上記の行はソケットをlocalhostにバインドします」いいえ、しません。INADDR_ANYにバインドします。これにより、任意のNICを介した接続を受け入れることができます。OPが行っていることはすでに正しいです。答えは完全に間違っています。反対投票。
ローン侯爵、2011

@EJP:あなたは正しいですServerSocket、私は答えを変更しました。それにもかかわらず、clientSocketはまだへの接続を試みlocalhostます。
自宅

@home バインドアドレスに関するフレーズを削除する必要があります。
ローンの侯爵2011

7

同じ問題がありましたが、クライアントを実行する前にサーバーを実行すると修正されました。


4
もちろん、クライアントの前にサーバーを実行する必要があります。最初にクライアントを実行してサーバーに接続しようとすると、サーバーを起動したときに何にも接続しないことになります。
user3308043 14年

5
@ user3308043はい、それは明白でしたが、一部の新しいプログラマー(3年前の私など)にとってはあまり明白ではなかったので、私と同じように無知な仲間と共有したかっただけです。
Dao Lam

おかげで、それも役に立ちました。テスト接続は成功しましたが、テーブルデータを表示できませんでした。
Damien Christophe

6

私は上記の回答に追加したいという一つのポイントは、私の経験 -

localhost上の自分のサーバーでホストしていて、のような適切なURLを指定してAndroidエミュレーターを介してそれに接続しようとしていましたhttp://localhost/my_api/login.php接続拒否エラーが発生しました

注意点-PCのブラウザに行って同じURL(http://localhost/my_api/login.php使用したとき、正しい応答が得られました

私の場合の問題は、同じPC上のエミュレータから到達可能にするサーバーlocalhostIP(サーバーがマシンでホストされているため)に置き換えた用語でした。


ローカルマシンのIPを取得ipconfigするには、cmdでコマンドを使用します。IPv4は192.68.xx.yy Voilaのようになります。これは、サーバーがホストされているマシンのIPです。ローカルホストの代わりにそれを使用します

http://192.168.72.66/my_api/login.php


注-このコンピューターの外部のノードからこのプライベートIPに到達することはできません。(必要な場合は、Ngnixを使用できます)


4

Mqttブローカーでvernemq。という名前の同じ問題がありましたが、次のコードを追加することで解決しました。

  1. $ sudo vmq-admin listener show

リストを表示するにはo vernemqに許可されたIPとポート

  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
ダミールOlejar

2

私の経験が誰かに役立つことを願っています。同じ例外スタックトレースで問題に直面し、問題が何であるかを理解できませんでした。接続しようとしたデータベースサーバーが実行中で、ポートが開いていて接続を受け入れていました。

問題はインターネット接続にありました。私が使用していたインターネット接続は、対応するサーバーへの接続を許可されていませんでした。接続の詳細を変更すると、問題は解決しました。


1

私の場合、ソケットにサーバーの名前(私の場合は「raspberrypi」)を付けました。代わりに、IPv4アドレスがそれを作成しました。つまり、IPv6が壊れていました(名前はIPv6に解決されました)。


1

私の場合、設定の近くExpose daemon on tcp://localhost:2375 without TLSにチェックマークを付ける必要がありましたdocker(タスクバーの右側で、を右クリックしdocker、を選択しますsetting)。


1

閉じたのでこのエラーが発生しました ServerSocketその内部のクライアント数を受け入れようとするforループ内で(すべてのクリントの受け入れを完了していません)

ソケットを閉じる場所に注意してください


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
クライアントソケットを閉じなくても、接続拒否は発生しません。そこではないだろうことが、接続が拒否された場合には近いクライアントソケット。
ローン侯爵

0

DNSネットワークを変更したところ、問題が解決しました


-2

同じ問題がありましたが、catalina.outファイルの許可が正しくないことが原因であることが判明しました。tomcatユーザーは書き込みできませんでした。権限を修正すると、問題は解決しました。私はそれがtomcat8-initd.logファイルのログからのアクセス許可の問題であることを知っていました:

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


1
「許可が拒否されました」は「接続が拒否されました」と同じものではありません。
ローン侯爵

tomcat8-initd.logサーバーの出力ログに質問に記載されているエラーが正確に含まれていたのに、Permission deniedエラーがファイルにありました。
kbsbng

-3

クライアントの以前のインスタンスがまだ実行されており、ポート5000でリッスンしている可能性があります。


6
クライアントはリッスンしません。彼らは話します。
Raedwald 2014

以前のインスタンスは、クライアントではBindExceptionなくサーバーConnectExceptionで発生します。
ローンの侯爵
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.