【端末A <-> 端末B】 のみでアプリ間通信はどうやって実現したら良いでしょうか?

3,265 views
Skip to first unread message

nijiiroworks

unread,
Apr 20, 2011, 4:26:19 AM4/20/11
to 日本Androidの会
いつも貴重な情報を参考にさせて頂いております。

さっそく質問させて頂きたいのですが、
まず、スマートフォンはモバイル機器ですのでアプリを使用しながら移動が発生し、
基地局を跨げばIPが切り替わってしまうのでは?と認識しております。

今回Skypeチャットのようなアプリを開発することになったのですが、
リアルタイムで端末間メッセージ交換をする仕組みを、初回のみサーバを利用してIP登録。
その後、相手端末のIPをサーバから取得してSocketで各端末間のやりとりする形で考えていたのですが、
IPが頻繁に切り替わってしまうとSocket接続ができなくなってしまいます。

理想をいえば 【端末A <-> 端末B】 のみでアプリ間通信がしたいのですが、
こうした自端末に他端末からメッセージ送信をする仕組み、つまり自端末のサーバ化というのはどのように実現したらよいのでしょうか?
上記のIPが頻繁に変わってしまう可能性があるという問題から良い案が浮かびません。

まっ先に思いつくのは第三者サーバを用意して端末IPを登録し、一定期間毎(15秒とか)にポーリングで他端末のIPを取得。メッセージ交換は各端末同
士でという方法ですが、これは消費電力がかなり必要となりそうですので現実的ではなさそう。

SMSトリガーで端末同士のIP交換もありだとは思うのですが、一通5円では頻繁にIP通知ができません。

もっとも理想に近いのがC2DMですが、メッセージ数に制限があるようなので出来れば自前で用意できればと・・・。

例えば前述したSkypeや端末IPが頻繁に変わってしまっては困る、
VNCクライアントや端末Server化アプリはどのように接続を保証しているのでしょう?

大分わかりずらい文章になってしまいましたが、みなさまのお知恵をお借りできればと思っております。
宜しくお願い致します。

awwa

unread,
Apr 20, 2011, 11:04:18 AM4/20/11
to android-g...@googlegroups.com
あわと申します。

こういった場合、通信の開始を何の準備もなしに
「サーバ→特定のクライアント」でいきなり始めるのは無理かと思います。
クライアントのIPアドレスが変わるのが問題というか、
クライアントに割り当てられているアドレスが
グローバルなのか?という問題もあります。
(例えば、呼び出したい端末はどこかの無線LANに接続しているかもしれません)
また、クライアントがぶら下がっているネットワークの
FWでインバウンドの通信が止められているのが普通ですので、
結局のところどう頑張ってもこの方法では通信できないはずです。

でも、「クライアント→サーバ」なら大抵の場合繋がるはずです。
というわけで、「クライアント→サーバ」で全て解決します。
とりあえず、WebSocketとかCometとかのキーワードで検索してみてください。
もっと他にもやり方はあるかもしれませんが、
やりたいことはこの手法で実現できると思います。

C2DMも、プッシュのトリガとしてなら利用できます。
C2DMでトリガを受け取ったら、クライアントが実際のメッセージを
サーバに取りに行けばサイズの制限に引っかかることはないでしょう。

他にはAmazon Web ServiceのSimple Notification Serviceなんてのも
利用出来るかもしれません。
使ったことはないですが。

ではでは、ご参考までに。

2011年4月20日17:26 nijiiroworks <nijiirow...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

--
----
awwa <aww...@gmail.com>
Twitter http://twitter.com/awwa500
Blog http://awwa500.blogspot.com/

nijiiroworks

unread,
Apr 20, 2011, 5:15:42 PM4/20/11
to 日本Androidの会
名乗るのを忘れていました。工藤と申します。
まずは回答有難うございます。

WebSocketはまったく眼中にありませんでした。
なるほど!という感じで非常に参考になりました!

ただ、少し残念なのは

・android2.3でもWebSocketはサポートされてない
・がっつりドラフト中
・新しいプロトコルなのでproxyによっては通信が通らないことがある
・基本的にブラウザとサーバ間の技術(作りこめばなんとかなるか?)

といったところです(すべて拾い読みで検証はしていませんが)。

androidなどのスマートフォンくらい高機能になれば、単体でサーバになれるかな?というのが着想だったので、
まだ第三者サーバ経由でWebSocketやLongPollingを利用するしかなさそうということでちょっと残念です。。。
(あわ様にご指摘頂いたFW問題もあるのでどうしようもないですね)

端末固有番号やMACアドレスのようなもので
直接メッセージPUSHできるプロトコルができたら楽なのにと思うばかりです。

大分見当がつきました。
あわ様大変有難うございました。


On 4月21日, 午前12:04, awwa <awwa...@gmail.com> wrote:
> あわと申します。
>
> こういった場合、通信の開始を何の準備もなしに
> 「サーバ→特定のクライアント」でいきなり始めるのは無理かと思います。
> クライアントのIPアドレスが変わるのが問題というか、
> クライアントに割り当てられているアドレスが
> グローバルなのか?という問題もあります。
> (例えば、呼び出したい端末はどこかの無線LANに接続しているかもしれません)
> また、クライアントがぶら下がっているネットワークの
> FWでインバウンドの通信が止められているのが普通ですので、
> 結局のところどう頑張ってもこの方法では通信できないはずです。
>
> でも、「クライアント→サーバ」なら大抵の場合繋がるはずです。
> というわけで、「クライアント→サーバ」で全て解決します。
> とりあえず、WebSocketとかCometとかのキーワードで検索してみてください。
> もっと他にもやり方はあるかもしれませんが、
> やりたいことはこの手法で実現できると思います。
>
> C2DMも、プッシュのトリガとしてなら利用できます。
> C2DMでトリガを受け取ったら、クライアントが実際のメッセージを
> サーバに取りに行けばサイズの制限に引っかかることはないでしょう。
>
> 他にはAmazon Web ServiceのSimple Notification Serviceなんてのも
> 利用出来るかもしれません。
> 使ったことはないですが。
>
> ではでは、ご参考までに。
>
> 2011年4月20日17:26 nijiiroworks <nijiiroworks....@gmail.com>:
> awwa <awwa...@gmail.com>
> Twitterhttp://twitter.com/awwa500
> Bloghttp://awwa500.blogspot.com/

Takeyuki UEDA

unread,
Apr 20, 2011, 10:03:03 PM4/20/11
to android-g...@googlegroups.com, 日本Androidの会
上田と申します

> まず、スマートフォンはモバイル機器ですのでアプリを使用しながら移動が発生し、
> 基地局を跨げばIPが切り替わってしまうのでは?と認識しております。

誤解です。基本的に基地局をまたいでも ps呼はハンドオーバーされます。

- Takeyuki

Reply all
Reply to author
Forward
0 new messages