LoginSignup
31
36

More than 5 years have passed since last update.

AndroidでSocket通信

Posted at

あるリンクのレスポンスが独自スキーマ(google play storeのmarket://など)である場合、ブラウザでそのコールバック内容を確認できません。確認したい場合は以下の手立てが考えられます。

  • WebViewでWebViewClient#shouldOverride(url)でURLを表示する
  • Socket通信でリクエストの返り値を表示する

このうちSocket通信はjavaのAPIとしてあり、容易に実装できます。ちょっと注意点もあるので、まとめてみました。

実装のポイント

1.ネットワークリクエストはUIスレッドから投げない

何も考えずにソケットをつくろうとすると、NetworkOnMainThreadExceptionが発生してしまいます。

UIスレッドでネットワーク通信が許可されてないからです。(Android 3.0以降)

今回はリクエストを受け取ることも考えてAsyncTaskで実装します。


public void connect(){

        //第一引数:execute()で入れるパラメータ
        //第二引数:onProgressUpdate()にいれるパラメータ
        //第三引数:onPostExecute()に入れるパラメータ
        new AsyncTask<Void,Void,String>(){

            @Override
            protected String doInBackground(Void... voids) {
                Socket connection = null;
                BufferedReader reader = null;
                BufferedWriter writer = null;
                String message = "result:";
                String url = "http://" + mHost +":" + mPort + mPath;
                try {
                    //ソケット
                    connection = new Socket(mHost, mPort);
                    reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
                    // ~~ 中略 ~~

                return message;
            }

            //doInBackGroundの結果(message)を受け取る
            @Override
            protected void onPostExecute(String result){
                mTextView.setText(result);
            }
        }.execute();



    }

doInBackground()で通信処理を行い、その返り値を受け取るのがonPostExecute()となります。

onPostExecuteでUIスレッドに値を返してあげます。

2.ユーザーエージェントを指定する

何も考えずにリクエストを投げると、モバイルからの通信だと判定されません。場合によっては正しくないレスポンスが返ってくる可能性があります。
なので、リクエストヘッダーにUser-Agent情報を追加してあげます。例えばサーバー側にAndroid4.0として認識してもらいたい場合は、

private String mUserAgent = "Mozilla/5.0 (Linux; U; Android 4.0.4; ja-jp; SC-06D Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30";

//BufferdWriterで設定
writer.write("User-Agent: " + mUserAgent);

User-Agentについてはこちらを参考にしました。-> http://www.openspc2.org/userAgent/

ソースコード

上記内容を実装したアプリはこちらにあります。Android Studioで作成しているのでプロジェクトimportして実行すれば動きます。

https://github.com/tomoima525/SimpleSocketApplication

Imgur

参考

31
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
36