初めまして。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に書き換えて試したりもしましたが、結果は同じでした。