質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1379閲覧

IPアドレス、ポート番号から指定したNTRIP Casterページの情報を取得

adk

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

1クリップ

投稿2019/10/30 09:32

編集2019/10/31 00:04

お世話になっています。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/10/30 10:31

「Android Studioから」という表現がありますが, Android Studio は開発環境であって, 表面上 Android Studio 内で実行しているようにみえましても, 実際は Android(やそのエミュレータ) で実行されています. この辺りを混在されますと内容が分かり難くなりますので, ご一考頂けると幸いです. また, ご提示されたコードは XML ではなく java と思いますので, ```xml を ```java として頂いたほうがよろしいかと思います.
jimbe

2019/10/30 10:45

レスポンスコードは幾つになっているでしょうか.
adk

2019/10/31 00:17

>>jimbe様 ご指摘ありがとうございます。 接続ページはNtrip Casterであるため、レスポンスコードはありません。 その旨を本文に書いておくのを忘れていたため、修正と同時に本文に追記いたしました。
jimbe

2019/10/31 02:43

Ntrip を使ったことがないので推測になりますが, http ベースで実際にブラウザからアクセス出来るのであれば, http の応答としてコードが送られてきているのではないでしょうか. また, ブラウザで正常に取得できた時のテキストが分かっているのでしたら, Socket で直接アクセスしてみては如何でしょうか.
guest

回答1

0

自己解決

下記サイトをもとにSocket通信を行うとうまくいきました。

ありがとうございました。

https://blog.csdn.net/qq_16064871/article/details/52254991

//mHost=○○.○○.○○.○○ //mPort=△△△△ とグローバル関数で指定しておく。 AsyncTask<Void,Void,String>(){ //表の文字列を取得。 public HTTPReceiver(Spinner spinner){ _Spinner=spinner; } @Override protected String doInBackground(Void... voids) { Socket connection = null; BufferedReader reader = null; BufferedWriter writer = null; String message = ""; try { //ソケット connection = new Socket(mHost, mPort); reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream())); writer.write("GET / HTTP/1.1\r\n"); writer.write("User-Agent: " + "□□□" + "\r\n");            //自らのソフト、アプリ、ブラウザ等の種類を指定するための関数(「私、○○と申しますという」名刺のようなものらしい。)            //□□□には適切な名称を調べて入れる。            //これがないと入れないサーバーもある。 writer.write("Accept: "+"*/*"+"\r\n"); writer.write("Connection: "+"close"+"\r\n"); writer.write("\r\n");//2個改行を入れないとアクセスできないサーバーもあるので余分に改行。 writer.flush(); //HTTPレスポンス String result; while((result = reader.readLine()) != null) { message += result; message += "\n"; } } catch (IOException e) { message = "IOException error: " + e.getMessage(); e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); message = "Exception: " + e.getMessage(); } finally { try{ reader.close(); connection.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println(message); return message; } //doInBackGroundの結果を受け取る @Override protected void onPostExecute(String result){ //あとは結果をスピナーにセット } }

投稿2019/10/31 09:04

adk

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問