2012-01-11 19 views
2

ソケットを作成し、InputStreamを取得します。ここで私はそれを試しています。ソケットを作成できません:java.net.ConnectException:接続が拒否されました:connect

try { 
    final String serverIP = "111.111.111.111"; 
    final int serverPort = Integer.parseInt(server_port); 
    final InetAddress serverAd=InetAddress.getByName(serverIP); 
    final InetAddress localAd =InetAddress.getByName(local_ip); 
    final int localPort = 4040; 

    Socket socket = new Socket(serverAd, serverPort, localAd, localPort); 
} 

しかし、スローされた例外があり、ここで

java.net.ConnectException: Connection refused: connect 
    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:366) 
    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:276) 
    at shootist.Porter.run(Porter.java:41) 

サーバーは私がデータをRTP送信し、サーバ側がOKと確認されました。私は招待状を送り、200も持ってきました。私のIPとポートに問題がある場合は、すべての応答を私のIPポートと指定されたポートに渡すことはできません。しかし、サーバーが私のIPと指定されたポート番号に私の応答を送るので、それは起こり得ません。 この問題をどのように修正できますか?どこが間違っていて、何ですか?

+0

サーバーとクライアントマシンのポート番号にファイアウォール例外を追加します。さらに、PCからファイアウォールを外してください。 – Acn

+0

ありがとうございます。ファイアウォールの例外をクライアントマシンのポート番号に追加する方法を教えてください。 –

答えて

9

Aエラーは、サーバー・マシン上のソケット・スタックは、あなたの接続要求を受信し、意図的にそれを受け入れることを拒否した意味「接続が拒否」試してみることです。これは、次の2つの理由のいずれかで発生します。

1)接続しようとしているポートでリスニングソケットが実行されていません。

2)リスニングソケットがありますが、保留中の接続のバックログがいっぱいです。その時点でリクエストをキューに入れる余地がありません。

この2つを区別するために、試行の間隔を数回延ばしてみてください。一貫して同じエラーが出たら、#1はおそらく原因です。ポート番号が正しいことを確認してください。 #2が原因であれば、あなたの再接続は最終的に成功する可能性があります。

+0

完全で包括的な答えです。 +1。 – 0xCAFEBABE

+0

Remyさん、ありがとうございます。ポート番号を変更して試しました。あなたが成功したリスニングソケットを作成する方法を教えてもらえますか?(私は少し新しくしました。) –

+0

もっと詳しく説明しますが、保留中の接続のバックログがいっぱいなのでキューできません。私はINVITEを送信してから200でサーバレスポンスを送り、サーバは私にデータを送り始めます。サーバがレスポンスを送り、対応するサーバのポートを取得するまで待つ必要があります(サーバのポートはresponse.INVITEは別のポートに送信され、サーバーが決定した別のポートにソケットが作成されます)上記のように、ソケットに再接続しようとしましたが、同じエラーが発生したため失敗しました。 –

1

接続が拒否されたということは、そのポートで待機していないサーバーに接続しようとしているか、接続を受け入れるのに余りにも余裕があることを意味します。

これをテストする簡単な方法は、

telnet 111.111.111.111 4040 
+1

が原因でエラーが発生する可能性があります。私の答えを見てください。 –

+0

@ RemyLebeau-TeamBバックログの良い点。サーバーはかなり悪い方法で戻ってログに記録する必要があります。 –

+0

必ずしもそうではありません。バックログは少し小さすぎるかもしれませんし、サーバーの 'accept()'レートは遅すぎるようにコード化されているかもしれません。あなたは本当に分かりません。 –

関連する問題