Help us understand the problem. What is going on with this article?

AndroidでSocket通信

More than 5 years have passed since last update.

あるリンクのレスポンスが独自スキーマ(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

参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away