51歳からのプログラミング　備忘　ネットワーク通信の備忘コード　Socket　｜ HttpURLConnection

#Socket

```java
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // スマホを前提に考えてるよ！
        // ネット接続されていたら非同期でサイト接続しようと思う！
        // まずは、接続の確認ね！
        ConnectivityManager manager      = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        Network network                  = manager.getActiveNetwork();
        NetworkCapabilities capabilities = manager.getNetworkCapabilities(network);

        // capabilities の hasTransport でネット接続を確認します
        // Wi-Fi か 携帯通信 のどちらかで接続されてたら、非同期で Socket通信するよ！
        if(capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)){
            new httpAsynctask().execute();
        }else{
            Log.d("\nConnection State","ネットに接続されてません");
        }
    }

    private class httpAsynctask extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... aVoid) {
            // お世話になってます、グーグル様にアクセスさせてね
            String site       = "www.google.co.jp";
            // ＝ どういう通信をするのかを設定 ＝
            // HTTP バージョン1.1 GET で通信
            // 接続先 host はグーグル様！
            // GET したら接続を閉めます
            String httpsocket = "GET / HTTP/1.1 \n" +
                    "Host: " + site + "\n" +
                    "Connection: close\n\n";

            // グーグル様の HTML 内容を蓄積する文字列バッファー
            // socket       :接続部
            // BufferWriter :読み込む HTML をバッファに蓄積
            // BufferReader :バッファーから HTML を読み出す
            StringBuffer   stringBuffer = new StringBuffer();
            Socket         socket       = null;
            BufferedWriter writer       = null;
            BufferedReader reader       = null;

            try {
                // socket に"www.google.co.jp",ポート 80 に設定
                // writer と reader にストリームを設定
                // writer に HTTP1.1 GET 通信で取得した HTML 分を読み込み
                socket = new Socket(site, 80);
                writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                writer.write(httpsocket);
                writer.flush();

                // writer で書き込んだバッファから
                // reader で1行ずつ読み出す
                while (reader.readLine() != null) {
                    stringBuffer.append(reader.readLine());
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (writer != null) writer.close();
                    if (reader != null) reader.close();
                    if (socket != null) socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return stringBuffer.toString();
        }
        @Override
        protected void onPostExecute(String stringBuffer){
            Log.d("\n START \n",stringBuffer);
        }
    }
}
```
Socket通信では、FQDN(Fully Qualified Domain Name)を指定ですね！

#HttpURLConnection
```java:
public class MainActivity extends AppCompatActivity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // AsyncTaskで使います！
        textView = findViewById(R.id.textView);

        // まずはネット接続の状態確認だね！
        // ネットワークケイパビリティを用意する！
        // ケイパビリティのhasTransportで接続を確認できます
        //     getSystemService(CONNECTIVITY_SERVICE)で接続状態を管理するオブジェクトを取得 manager
        //     接続管理オブジェクトのgetActiveNetwork()でアクティブな接続オブジェクトを取得  network
        //     アクティブな接続オブジェクトのネットワークの性能情報を取得 capabilities
        ConnectivityManager manager      = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
                                           // getActiveNetwork()はManifest permission ACCESS_NETWORK_STATEが必要
        Network             network      = manager.getActiveNetwork();
        NetworkCapabilities capabilities = manager.getNetworkCapabilities(network);

        // ケイパビリティの hasTransportメソッドで WIFI接続を確認
        // WIFIに接続している時だけ、非同期通信するよ！
        if(capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
            new httpAsyncTask().execute();
        }else{
            Log.d("\n\nMSG","no connect\n\n");
        }
    }

    // 非同期通信 AsyncTask<doInBackgroundURL,onProgressUpdateInteger...,onPostExecute(Result)>
    private class httpAsyncTask extends AsyncTask<Void,Void,String> {
        @Override
        protected String doInBackground(Void... aVoid) {
            // try句  catch句 finally句 で使う変数を宣言するよ！
            HttpURLConnection   urlConnection = null;
            BufferedReader      reader        = null;
            StringBuffer        stringBuffer  = new StringBuffer();

            try{
                // HttpURLConnectionで接続設定！
                urlConnection   = (HttpURLConnection) new URL("https://google.co.jp").openConnection();
                // Bufferに積み上げられたグーグル様のページ情報を読み込むための準備！InputStream()を使うよ！
                reader          = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                // FileReader や InputStream　とかの時間のかかる処理は Buffer でラップして使うといいんだって by reference

                // Buffer から一行ずつ読み込んで、stringButterにため込みます
                while(reader.readLine() != null){
                    stringBuffer.append(reader.readLine());
                }
            }catch(Exception e){
                return "MSG : FAILED TO CONNECT";
            }finally{
                try {
                    if(reader        != null) reader.close();
                    if(urlConnection != null) urlConnection.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            // onPostExecute()に送ります
            return stringBuffer.toString();
        }

        // doInBackground()から stringを受け取り、なんかしたいことをします。
        // ここではUI部品を操作するコードを書いたりね！
        @Override
        protected void onPostExecute(String stringBuffer){
            textView.setText(stringBuffer);
        }
    }
}
```
#独り言
- getSystemService()　：　Contextのメソッド
- CONNECTIVITY_SERVICE　：　Contextの定数

- InputStreamReader　：　import<br>public class InputStreamReader extends Reader<br>public abstract class Reader extends Object implements Readable, Closeable<br>Readable public:interface Readable