お世話になっています。
http://○○.○○.○○.○○:△△△△
(○○.○○.○○.○○はIPアドレス、△△△△はポート番号)
というNTRIP Casterのページの情報を取得したいです。
(HTTPのプロトコルは使っていますが純粋なWebserverではないページです)
開発環境はAndroid Studio、動作環境は実機です。
上記URLはWEBブラウザにそのまま張り付けると問題なく表示されます。
このページの中身の文字列をAndroid上で取得したいのですが、うまくいきません。
ブラウザからのソーステーブル取得時のヘッダーフィールドの値は
GET / HTTP/1.0
Accept: /
Connection: close
で、Android Studioからの以下の式でとろうとしたときのヘッダーフィールドの値は
GET / HTTP/1.1
Connection: Keep-Alive
Accept-Encoding: gzip
だったので
con.setRequestProperty("connection", "close");
con.setRequestProperty("accept", "/");
などの関数を付けてみたのですが、接続はできてもどうしても
is = con.getInputStream();
のInputStream取得の段階でエラーが出ます。
そもそもHttpURLConnectionでやるべきかどうかもわかりません。
この解決法についてアドバイスを頂けましたら幸いです。よろしくお願いします。
java
1private class HTTPReceiver extends AsyncTask<String,String,String>{ 2 private Spinner _Spinner; 3 4 //表の文字列を取得。 5 public HTTPReceiver(Spinner spinner){ 6 _Spinner=spinner; 7 } 8 9 //バックグラウンドでURLの文字列取得 10 @Override 11 public String doInBackground(String... params){ 12 String urlStr="http://○○.○○.○○.○○:△△△△"; 13 String result=""; 14 //Http接続を行うHttpURLConnectionオブジェクトの宣言。finallyで確実に開放するためtry外で宣言。 15 HttpURLConnection con=null; 16 //HTTP接続のレスポンスデータとして取得するInputStreamオブジェクトの宣言。同じくtry外 17 InputStream is=null; 18 19 try{ 20 //URLオブジェクト作成 21 URL url=new URL(urlStr); 22 23 con =(HttpURLConnection)url.openConnection(); 24 // リクエストメソッドの設定 25 con.setRequestMethod("GET"); 26 //インプットするか 27 // postの場合必要 28 con.setDoInput(true); 29 //con.setDoOutput(true);trueにするとPOSTとして認識される。 30 31 con.setConnectTimeout(0);//サーバーとの通信の接続が確立するまでにかかる時間の上限 32 con.setReadTimeout(0);//サーバーへリクエストを投げてからレスポンスが返ってくるまでの時間の上限 33 con.setInstanceFollowRedirects(false);// リダイレクトを自動で許可しない設定 34 con.setRequestProperty("connection", "close"); 35 con.setRequestProperty("accept", "*/*"); 36 con.setAllowUserInteraction(true); 37 38 //接続 39 con.connect(); 40 41 try { 42 //HttpURLConnectionオブジェクトからレスポンスデータを取得。 43 44 //ここでエラーが出る//////////////////////////////////////////////////// 45 is = con.getInputStream(); 46 //エラーが出た後はFileNotFoundExceptionへ行く//////////////////////////////////////////////////// 47 48 //レスポンスデータであるInputStreamオブジェクトを文字列に変換 49 result = is2String(is); 50 51 }catch (FileNotFoundException e) { // IOException をキャッチするより先に FileNotFoundException をキャッチしないと IOException のキャッチブロックに行くのでこうする 52 System.err.println(e); 53 InputStream err = null;//エラーに行ったInputStreamの内容 54 try { 55 err = con.getErrorStream(); 56 // 4xx または 5xx なレスポンスのボディーを読み取る 57 result = is2String(err);//エラーが出たのち、ここに行くとresultの中身はnullである。 58 } finally { 59 if (err != null) { 60 try { 61 err.close(); 62 } catch (IOException errr) { 63 System.err.println(errr); 64 } 65 } 66 } 67 } 68 } catch (MalformedURLException e) { 69 e.printStackTrace(); 70 } catch (IOException e) { 71 e.printStackTrace(); 72 } 73 finally { 74 if(con!=null){ 75 con.disconnect(); 76 } 77 if(is!=null){ 78 try{ 79 is.close(); 80 }catch (IOException e) { 81 } 82 } 83 } 84 return result; 85 } 86 87 88 //InputStream文字列を文字列に変換するメソッド 89 private String is2String(InputStream is)throws IOException{ 90 BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8")); 91 StringBuffer sb =new StringBuffer(); 92 char[] b =new char[1024]; 93 int line; 94 while(0<=(line = reader.read(b))){ 95 sb.append(b,0,line); 96 } 97 return sb.toString(); 98 } 99 100 101 @Override 102 protected void onPostExecute(String result) { 103 //以下、文字列が取れたら加工してspinnerに値をセットする 104 } 105 106 } 107 108
回答1件
あなたの回答
tips
プレビュー