PC、エミュレータ間のソケット通信に関して

2,252 views
Skip to first unread message

timai

unread,
Mar 18, 2011, 4:44:02 AM3/18/11
to 日本Androidの会
お世話になります。
timaiと申します。

表題の件、PCをクライアント、エミュレータをサーバにして
ソケット通信を行おうとしているのですが、コネクトは
できるものの、その後の通信ができない状態です。

・エミュレータ上でソケットサーバをサービスにて起動。
・クライアント側を起動して接続。
・接続は正常にでき、接続確認のレスポンスも帰ってきます。
・その後クライアントからデータ送信・・・無反応

IPアドレスについて疑問があるのですが、PC側をサーバにした場合は
ローカルIPで通信が確認できていますが、エミュレータ側をサーバにした場合
10.0.2.<xx>で接続する必要があるのかなと思い以下の手順で接続しています。

ポートフォワード設定
adb forward tcp:5000 tcp:6000

接続
Socket socket=new Socket("localhost", 5000);

クライアント側はソケットオブジェクトも存在し送信しているように
見えるのですが、サーバ側で受信してくれません。

どなたか同じようなご経験された方いらっしゃいませんでしょうか。
そもそものやり方がまずいのでしょうか?

鷹見純

unread,
Mar 18, 2011, 9:54:43 AM3/18/11
to android-g...@googlegroups.com
timai様

PC-emulatorでの通信では,127.0.0.1 を使用して通信できます。

詳細は,http://developer.android.com/guide/developing/devices/emulator.html の
Network Address Space 及び Local Networking Limitations に紹介がありますので,そちらを参考にしてください。


手順は,
emulatorのサーバを起動
ポートフォワード    adb forward tcp:xxxx tcp:xxxx
PCのクライアントから アドレス127.0.0.1,ポート xxxx を使用してサーバと通信を行う
でできるはずです。

以下は,簡単な確認手順です。Linuxのnetstatを使用します。
サーバがポート9000で待ち受け(LISTEN)し,その後,クライアントでconnect (サーバでaccept)をした時の確認方法です。

以下は,LISTENで待っている時,
adb shell netstat を行うと,ポート9000はany(0.0.0.0)でListne待ちしています。
Proto Recv-Q Send-Q Local Address          Foreign Address        State
 tcp       0      0 0.0.0.0:9000           0.0.0.0:*              LISTEN
 tcp       0      0 127.0.0.1:5037         0.0.0.0:*              LISTEN

接続後,asb shell netstat を実行すると,Stateは"LISTEN"から"ESTABLISHED"に変わり接続したことがわかります。
Proto Recv-Q Send-Q Local Address          Foreign Address        State
 tcp       0      0 127.0.0.1:5037         0.0.0.0:*              LISTEN
 tcp       0      0 0.0.0.0:5555           0.0.0.0:*              LISTEN
 tcp       0      0 127.0.0.1:9000         127.0.0.1:52690        ESTABLISHED
 tcp       0      0 127.0.0.1:52690        127.0.0.1:9000         ESTABLISHED

試してみてください。

by 鷹見

Reply all
Reply to author
Forward
0 new messages