0

私の会社は、システム用に独自のカスタム Android ハードウェアを作成しています。

現在、互いに通信し、それらの内部の sqlite データベースを同期する必要がある 2 つの Android デバイスがあります。

この問題を解決するために、カスタム ソケット プロトコルの作成を開始しました。これは、サーバー クライアント モデルに基づいていました。しかし、開発を重ねるうちに、各デバイスでサーバー ソケットが実行されている必要があり、システム内で 3 つ以上のデバイスと通信することが可能であり、サーバーが停止したり、再起動したり、クラッシュしたりする可能性があることがわかりました。

したがって、私の考えは、各デバイスに配列に保存した一連のポートを検索させ、デバイスがチェックしたときに現在利用可能なポートにバインドし、その周りに ServerSocket を作成することです。

これは、device1 が ServerSocket(1111) を持ち、device2 が ServerSocket(1112) などを持っている可能性があることを意味します。

次に、各デバイスは複数のポートを介してメッセージを送信します。例: device1 は配列を繰り返し処理し、クライアント ソケットを開き、各ポートにメッセージを送信します。 Socket socket = new Socket(IP,1112); メッセージを送信します... Socket socket = new Socket(IP,1113); メッセージを送信...など

もちろん、私はすでにこれをマルチスレッド (Android サービスによって実行) にしているので、Android デバイスで UI スレッドをブロックすることはありません。

私の質問は、私はこれを正しく行っていますか? または、Javaでこれを行うためのより良い方法はありますか?

編集:

私の問題を説明するためにいくつかのコードを追加することにしました。

私は複数の Android デバイスを TCP/IP 経由で接続しており、各デバイスに次のように ServerSocket を作成しています。

ServerSocket serverSocket = new ServerSocket(4000);

2 番目のデバイスがこれを試みると、ソケットが別のデバイスによって使用されているため、Java でエラーが発生します。それらの IP アドレスは、172.23.3.128 や 172.23.3.127 のようなものです。

したがって、異なるIPアドレスを持っていても、Javaからエラーが発生し、そのポート/ IPに既にバインドされているというエラーが表示されます。これは私が理解していないものです。

4

3 に答える 3

1

これは意味がありません。デバイスにはそれぞれ独自の IP アドレスが必要です。異なるポート番号も必要ありません。それらはすべて同じポート番号を使用できます。

于 2013-03-29T02:49:53.737 に答える
1

次のこともできます。

  • クライアントに特定の UDP ポートをリッスンさせる
  • クライアントもそのポートにブロードキャストし、その存在を通知します
  • クライアントがブロードキャストを受信すると、TCP または UDP のいずれかを介して、エフェメラル ポートから事前に決定されたセカンダリ ポートへの直接接続を開始できます。

これは、少なくとも通常は行われる方法です。

于 2013-03-29T02:54:59.730 に答える
0

基本的にサーバーは障害なく動作する必要があります。あなたの考えはサーバーの中断です。それ以外の場合は、ポートでそれぞれ複数のクライアントからの接続を受け入れる単一のサーバーを使用できます (例: 5000、5001、5002 など)。

各クライアントのソケット ポートを修正します。サーバーは、試みたとおりに配列を開きます。

複数のポートを介してメッセージを送信するとはどういう意味ですか? クライアントごとに 1 つのポートを使用しないと、メッセージを送信しているクライアントを認識できません。

于 2013-03-29T02:40:53.713 に答える