web-dev-qa-db-ja.com

java.net.ConnectException:接続が拒否されました

私は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);
                }
            }
        }
    }
}
158

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

  • あなたは間違ったIP /ホストまたはポートに接続しようとしています。
  • サーバーを起動していません。
  • サーバーは接続を待機していません。
  • Windowsサーバーでは、リスンバックログキューがいっぱいです。
278
Collin Price

私はチェックします:

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

最も簡単な出発点は、おそらくtelnetまたはPuTTYを使ってクライアントマシンから手動で接続しようとすることです。それが成功した場合、問題はクライアントコードにあります。そうでない場合は、解決する必要があります なぜ それはしていません。 Wireshark はこの面であなたを助けるかもしれません。

34
Jon Skeet

私は同じ問題を抱えていましたが、クライアントを実行する前にサーバーを実行して問題を解決しました。

6
Dao Lam

私はvernemqと呼ばれるMqttブローカーと同じ問題を抱えていましたが、以下を追加することによってそれを解決しました。

  1. $ Sudo vmq-admin listener show

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と新しいポートを追加します。これで問題なく接続できるはずです。

それがあなたの問題を解決することを願っています。 enter image description here

4
MrOnyancha

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

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

行う

Socket clientSocket = new Socket(serverName, 5000);

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

4
home

上記の回答に追加したい点の1つは、私の経験-

「サーバーでlocalhostでホストし、http://localhost/my_api/login.phpなどの適切なURLを指定してAndroidエミュレーターで接続しようとしていました。 接続拒否エラー "

注意点- PCのブラウザにアクセスして同じURLを使用したとき(http://localhost/my_api/login.php正しい応答を得ていた

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


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

http://192.168.72.66/my_api/login.php


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

2
eRaisedToX

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

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

2
phoenix

私の場合、docker設定のExpose daemon on tcp://localhost:2375 without TLSの近くにチェックマークを付けなければなりませんでした(タスクバーの右側にあるdockerを右クリックし、settingを選択してください)

1
user1419243

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

1
Zhyano

forループの中でServerSocketを閉じて、その中のクライアントの数を受け入れようとしたため、このエラーが発生しました(すべてのクリントを受け入れ終えていない)

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

1

私は同じ問題を抱えていました、そして、問題は、私がソケットオブジェクトを閉じていなかったということでした。問題が解決しました。このコードは私には役に立ちます。

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

    }
}
0
Santosh Karna

私は同じ問題を抱えていました、そしてそれはcatalina.outファイルの許可が正しくないことが原因であることが判明しました。 Tomcatユーザーは書き込みできませんでした。権限を修正したら、問題は解決しました。私はそれがTomcat8-initd.logファイルのログからパーミッションの問題であることを知るようになりました:

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

0
kbsbng

両端でポート番号が常に異なる

0