1

次のエラーが発生しました。

java.net.ConnectException: Connection refused: connect

以下にいくつかのコードを示しますが、最初に、説明が困惑するので説明します。最初に押すボタン (ホストまたは接続) に応じて、サーバーまたはクライアントとして機能する非常に基本的なチャット プログラムを作成しました。ローカルホストと友人とのインターネットの両方でテストされ、意図したとおりに完全に動作します。私は 2 つ目のソフトウェアを書き始め、ほぼ同じコードを使用しましたが、より多くのクラスがあるため、同じプログラムのホストに接続しようとするとこのエラーが発生します。したがって、prog A は prog A に正常に接続できますが、B は B に接続できません。ファイアウォールの問題を想定する人もいるかもしれませんが、プロットのひねりがあります。B は A に接続でき、A は B に完全に接続できます。しかし、B は自分自身の別のコピーに接続できません。私は TCP の公式オラクル チュートリアルを使用し、A と呼ばれるチャット プログラムで完璧に動作しました。は、そのメイン クラスのメソッドの 1 つを実行します (サーバーまたはクライアントを開始するため)。一方、B は、クラスの新しいオブジェクト、またはホストを作成します。

public class Host
{
static ServerSocket serverSocket = null;
static Socket clientSocket = null;
static PrintWriter out = null;
static BufferedReader in = null;
static String inputLine;
public Host() throws IOException
    {
    serverSocket = new ServerSocket(4444);
    System.out.println("Server created, waiting for guest.");
    clientSocket = serverSocket.accept();
    System.out.println("Guest connected.");
    out = new PrintWriter(clientSocket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    while ((inputLine = in.readLine()) != null)
        {
        //if (inputLine.equals("q")) {break;}
        System.out.println("Message recieved:" + inputLine);
        }
    }
}

またはゲスト

public class Guest
{
static Socket socket = null;
static PrintWriter out;
static BufferedReader in = null;
static String inputLine;
public Guest() throws IOException
    {
    System.out.println("Connecting to host");
    try
        {socket = new Socket("localhost", 4444);
         out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        }
    catch (UnknownHostException err) {System.out.println("unknown host"); System.exit(3);}
    catch (IOException err) {System.out.println(err); /*System.exit(4);*/}
    System.out.println("Connected to host");

    while ((inputLine = in.readLine()) != null)
        {
        //if (inputLine.equals("q")) {break;}
        System.out.println("Message recieved:" + inputLine);
        }
    }
}

適切なインポートがありますが、ここに貼り付けていません。両方のプログラムが localhost に接続しようとしますが、A のみが機能しますが、この他のプログラムは機能しません。ここでも、Guest を作成すると、chatprogram のサーバーに接続できます。チャットプログラム クライアントは、このサーバーに接続できます。しかし、このクライアントはこのサーバーに接続できません。

誰かが似たようなことを経験しましたか? 明らかな解決策はありますか、私が見逃しているものはありますか? ここでは本当に無知です。サーバー/クライアントコードを文字通りコピー/貼り付けました。

編集:スタックトレース。

java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at mainPack.Guest.<init>(Guest.java:21)
at mainPack.GameStarter.grandMain(GameStarter.java:101)
at mainPack.GameStarter.<init>(GameStarter.java:27)
at mainPack.GameStarter.main(GameStarter.java:34)
4

3 に答える 3

2

ホストでは、1 つの接続のみを受け入れると、サーバーはリッスンを停止します。何かがその接続を拘束している場合、ホストに接続できるものは他にありません。受け入れられた接続は、ホストがループしてサーバーソケットで再びリッスンできるように、処理のためにすぐに別のスレッドに委任する必要があります。Socket チュートリアルの「複数クライアントのサポート」を参照してください。

于 2013-02-25T01:45:27.477 に答える
0

staticの変数から宣言を削除しますGuest。同じですHost(ただし、ホストが1つしかない場合は問題ありません)。

アップデート

例:疑似コード

create server socket
while true (or quit received) {
    accept connection
    spawn thread to handle communication
}
于 2013-02-25T01:20:46.440 に答える
0

これがどのように実行されているか、およびエラーが正確に何であるかについての詳細が必要ですが (クライアントがホストに到達しようとしたときにネットワークレベルの接続エラーを返すと思われます)、一般的に使用されているポートは 4444 だけです。エラー(投稿されていません)は、このポートが同じマシン上のそのポートで通信している最初のプログラムによって使用されていることです。

さらに、静的参照では、特定の JVM に一度に存在できるさまざまなソケットのインスタンスは 1 つだけです。これらは、同じ (1 つの) 静的リソースを使用する他のクライアント クラスによって実装される可能性のある複数のスレッドによって同時に使用することはできません。

于 2013-02-25T01:29:10.843 に答える