1

ネットワーク経由でデータを受信できるアプリケーションを構築し、このデータを使用して無関係なことを行う必要があります。

これが私がしていることを明確にするためのコードです。

サーバー側:

static Socket client = null;
static ServerSocket ss = null;

if (ss != null) {
                ss.close();
            }
            ss = new ServerSocket(5513);
            isrunning = true;
            System.out.println("Waiting for client...");
            client = ss.accept();
            System.out.println("Client accepted.");
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));

そしてクライアント側:

Socket client = null;
PrintWriter out = null;
                    try {                            
                        client = new Socket("hostname", 5513);
                        out = new PrintWriter(client.getOutputStream(), true);
    }

これは単なるコードであることに注意してください。コードにエラーはありません。

サーバー側のコードを実行した後、クライアントが接続するのを正しく待機します。

ここに問題があります。クライアント側から接続しようとすると、「接続が拒否されました」というエラーが発生します。

しかし、インターネット上で、クライアント側からtelnetを試してみるように言われたものを見つけました。たとえば、サーバー側のIPを192.168.1.1とします。したがって、このコマンドを使用した後:

    telnet 192.168.1.1 5513

私は実際にサーバーとの接続を取得します。コマンドは空の画面を起動し、コマンドラインで手動で入力したものはすべて、Enterキーを押した後にサーバー側に送信されます(デバッグでチェックされます)。

そのため、サーバー側に手動で接続してデータを送信することはできますが、コードが接続を拒否します。

私が間違っていることを知っている人はいますか?

4

4 に答える 4

3

これは実際に使用しているコードですか?

client = new Socket("hostname", 5513);

次のように変更してみてください。

client = new Socket("192.168.1.1", 5513);
于 2012-04-13T17:04:36.230 に答える
2

client = new Socket("hostname", 5513); ホスト名は、接続しているIPアドレスを表す必要があります。自分自身に接続しようとしている場合は、「localhost」になります

また、サーバーは常にクライアントをリッスンしていませんwhile。サーバーが接続をリッスンして受け入れるように、ループが必要です。

while (true) {
   client = ss.accept();
   out = new PrintWriter(client.getOutputStream(), true);
   //You should probably assign it to a seperate thread to handle stuff for this client
}

そして、なぜその特定のエラーが発生するのかを説明する必要があります。接続が拒否されたというメッセージが表示された場合、通常は、接続先のIPアドレスが接続の送信を認識しており、その接続をリッスンしていなかったためにブロックしていることを意味します。基本的に、サーバーが閉じたときにクライアントのリッスンを停止したため、そのポートに着信したものはすべてブロックされます。もちろん、他のケースとしては、ファイアウォールでJavaがブロックされている可能性があり、例外を作成する必要があります。これは、達成しようとしていることがLAN経由の場合はめったにありません。

于 2012-04-13T17:13:30.177 に答える
0

クライアントのSocketオブジェクトで実際に「ホスト名」を使用していませんか?

192.168.1.1である必要があります。

于 2012-04-13T17:04:19.073 に答える
0

あなたはWindowsを使用していますか?もしそうなら、インバウンドとアウトバウンドを有効にしてファイアウォールにjava.exeとjavaw.exeを追加しましたか?ファイアウォールに5513のルールを追加しましたか?

はいWindowsでファイアウォール設定がない場合は、それが答えです。ファイアウォールを開きます。

于 2012-04-13T17:06:27.637 に答える