3

これが私が何日も働いている/探しているどこかに投稿されている場合は申し訳ありません。

問題:

ピアツーピアネットワークを介してAndroidデバイスと通信しているときにSocketTimeoutExceptionsが発生します。

詳細:

これが発生した場合、Androidデバイスはwifiではなく独自のモバイルネットワークを使用します(wifiはとにかくこれで動作するように設計されていません)。

Androidデバイスはwhatismyip.comからipAddressを正常に取得します。

一方のデバイスは、使用しているピアツーピアネットワーク以外の手段を介してもう一方のIPアドレスを送信します。

リモートデバイスのIPアドレスがローカルデバイスに正常に送信されます。

ローカルデバイスがピアツーピアネットワークを介して応答すると、TimeoutExceptionが発生します。

私が試したこと:

タイムアウトを非常に長い期間に延長します。

他のAndroidデバイスを使用する。

注目すべき:

この同じピアツーピアネットワークは、ローカルエリアネットワーク上のPC(重要な場合はLinuxとWindowsを実行している)間で正常に動作することがテストされていることに注意してください。また、PCの有線インターネット接続を介してピアツーピアネットワークをテストしたところ、間違いなく機能します。

私の推測:

デバイスがISPによって隠されていると思っているので、NATトラバーサルと同様のことを行うためにコードを作成する必要がありますが、よくわかりません。しかし、デバイスが非表示になっている場合は、接続拒否の例外が発生するはずです。

どんな助けでも大歓迎です。

PS現在、コードを投稿することはできません。たとえできたとしても、プロセス全体で数千行のコードになります。

4

3 に答える 3

2

まず第一に、ピアツーピアでの私の経験は、wifi接続のみですが、いくつかの概念は3Gにも適用されるべきだと思います。

接続拒否エラーが発生した場合は、ネットワークパケットが他のデバイスに到達できたが、デバイスが接続要求の受け入れを拒否し、否定応答がデバイスに到達したことを意味します。

接続タイムアウトエラーが発生した場合は、ネットワークパケットが他のデバイスに到達できなかったか、他のデバイスからの応答があなたのデバイスに到達しなかったことを意味します。

次に、2番目のエラー(接続タイムアウト)に焦点を当てましょう。

それをデバッグするための最初のステップは、接続を待機するデバイスを起動し、次にネットワークアクセスを備えたWindowsまたはLinuxマシンから、次のコマンドを発行します。

telnet deviceIp portWaitingForConnection

telnet画面が表示され、タイムアウトエラーが発生しない場合は、リクエスト接続を送信するコードに問題があることを意味します。

タイムアウトエラーも発生した場合は、ネットワークパケットがデバイスに到達できない(または応答が到達できない)ことが確認されています。

さて、ネットワークパケットがデバイスに到達するのを妨げている可能性があります。デバイスはルーターまたはファイアウォールの背後にある可能性があります。

デバイスがファイアウォールの背後にある場合は、着信接続用にファイアウォールポートを開く必要があります。

デバイスがルーターの背後にある場合(これは事実だと思いますが、whatismyip.comからIPアドレスを取得する必要はありません)、リスニングポートでの着信要求がローカルにリダイレクトされるようにルーターを構成する必要がありますデバイスのIPアドレス。

関連するコードがなければ、これ以上のことはできません。

幸運を。

于 2012-10-04T23:48:23.830 に答える
2

nat に問題があるようです。これを回避するためのいくつかの開始点を次に示します (ただし、udp に切り替える必要があると思います)。

もちろん、サーバーを導入することもできます。ハッピーハッキング:-)

于 2012-10-05T21:43:53.237 に答える
1

試してみるべきことは、接続を効果的にデバッグすることです。最初にできることは、残念ながら一部のネットワークが ICMP をブロックしている場合でも、 android devで示唆されているように isReachable を確認することです。

注意すべきもう 1 つの重要な点は、3g を使用している場合でも、ネットワークは引き続き NAT アドレスを使用できることです。これは非常に一般的であり、whatsmyip に表示される IP は NATed IP である可能性もあります。

次のステップは、アプリをハイブリッドモードで使用することです。つまり、1台のPCと1台のAndroidデバイスであり、PCに接続しようとします(パブリックIPまたは少なくとも転送ポートがあることを確認してください)。確かにそれはあなたの携帯電話会社です。

その場合は、wifi を使用するか、ローカル サーバーを使用して 2 つのピア間の接続を確立する以外にできることはありません。

また、p2pネットワークは成長するほど強力になることに注意してください。すでにネットワークに接続されていて、外部から到達可能なピアが他のピアに接続するのに役立つように実装することもできます.p2pリレーとホールパンチングを調べる必要があります.

于 2012-10-06T12:32:31.803 に答える