AndroidのSocket通信について

2,701 views
Skip to first unread message

shibe

unread,
Dec 28, 2010, 4:41:38 AM12/28/10
to 日本Androidの会
初めまして。shibeと申します。
現在、PCをサーバ、Androidをクライアントとし、無線ルータを使ったLAN内でSocket通信を試しています。
このとき、
「Androidからサーバにテキストを送信して、応答としてテキストを受け取りそれをAndroid上に表示する」
というようなやり取りは何の問題もなく行えるのですが、
「サーバ側からテキストを送信してAndroidがそれを受け取り表示する」
というようなサーバ側が起点のやり取りが非常に不安定になります。不安定というのは、パケットを全く受信せずにタイムアウトになったり、受信できたとし
ても送信から十数秒遅れて受信したりというような状態です。
全く受信できないわけではなく、受信できたりできなかったりという状況が不可解です。

LogCatを使って確認をとってみると、InputStreamをreadするタイミングでプログラムが止まっています。この状態でしばらく待つと受
信されることもあれば、されないこともあります。
PC側からWiresharkで確認してみると、送出したパケットが何度もTCP Retransmissionを起こしています。
解決法をご存知の方がいらっしゃれば、どうかご教授お願いします。

Socketによる受信を試すために作ったコードを記載します。コードに問題がある場合、指摘をお願いします。

public class SimpleSocket extends Activity {
TextView textView;
String receiveText;
Handler handler = new Handler();

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

textView = new TextView(this);
textView.setBackgroundColor(Color.rgb(255, 255, 255));
textView.setTextColor(Color.rgb(0,0,0));
setContentView(textView);

new Client("サーバのIPアドレス",サーバのポート番号);
}

class Client implements Runnable{
String host;
int port;
Socket socket;

public Client(String host,int port){
this.host = host;
this.port = port;
(new Thread(this)).start();
}

public void run(){
try{
socket = new Socket();
socket.connect(new InetSocketAddress(host,port));

InputStream in = socket.getInputStream();
byte[] data = new byte[1024];
int size;
while(socket!=null && socket.isConnected()){
size = in.read(data);
if(size<=0) break;
receiveText= new String(data,0,size,"UTF-8");
handler.post(new Runnable(){
public void run(){
textView.setText(textView.getText()+receiveText);
}
});
}
}catch(Exception e){
Log.v("client",e.toString());
}
}
}
}

PermissionはINTERNETのみです。
サーバ側はServerSocketでクライアントを待ち受けた後、一定時間ごとにテキストを送信するというJavaプログラムをPC上で動作させてい
ます。
また、Socket通信の部分をスレッドではなくAsyncTaskに書き換えて試したりもしましたが、結果は同じでした。

shibe

unread,
Dec 28, 2010, 11:11:56 PM12/28/10
to 日本Androidの会
投稿者のshibeです。書き忘れていたことを追記します。
動作確認はNexus One(Android 2.2.1)とDynabook AZ(Android 2.1)で行いましたが、どちらも同じ挙動で
した。
また、上記のプログラムをAndroidエミュレータで動作させ、サーバとの通信を試した場合は何の問題もなくうまくいきました。
ハードウェア的な制限なのでしょうか・・・。

だい

unread,
Apr 25, 2014, 4:58:28 AM4/25/14
to android-g...@googlegroups.com
だい です。
こちらの現象、私もぶつかっております。
なにか解決方法がみつかったのでしょうか?


2010年12月29日水曜日 13時11分56秒 UTC+9 shibe:
Reply all
Reply to author
Forward
0 new messages