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

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

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

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Q&A

解決済

1回答

3292閲覧

Java: Socket を用いて任意のURLのindex.htmlを取得する(「スッキリわかるJava入門 実践編」の改造)

risaito74

総合スコア44

Java

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

0グッド

1クリップ

投稿2016/11/02 12:58

「スッキリわかるJava入門 実践編」p.315にある「http://dokojava.jpを取得するプログラム」を目コピーで入力し、コマンドプロンプトからコンパイル、実行して、問題なく該当htmlが出力されることを確認しました。

java

1import java.net.*; 2import java.io.*; 3 4public class Main { 5 public static void main(String[] args) throws IOException { 6 Socket sock = new Socket("dokojava.jp",80); 7 InputStream is = sock.getInputStream(); 8 OutputStream os = sock.getOutputStream(); 9 10 os.write("GET /index.html HTTP/1.0\r\n".getBytes()); 11 os.write("\r\n".getBytes()); 12 os.flush(); 13 14 InputStreamReader isr = new InputStreamReader(is); 15 int i = isr.read(); 16 while(i != -1) { 17 System.out.print((char)i); 18 i = isr.read(); 19 } 20 sock.close(); 21 } 22}

次に、取得するURLを自分の持っているwebスペース「http://hoge.sakura.ne.jp/」(仮名)にしようと、以下の部分を書き換えました。

Socket sock = new Socket("dokojava.jp",80);

Socket sock = new Socket("hoge.sakura.ne.jp",80);

しかし、実行すると以下のような出力となりました。

HTTP/1.1 404 Not Found
Date: Wed, 02 Nov 2016 12:41:05 GMT
Server: Apache/2.2.31
Content-Length: 208
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL /index.html was not found on this server.</p> </body></html>

※ブラウザから「http://hoge.sakura.ne.jp/index.html」へのアクセスは問題なくできます。

ポート番号の設定や、サーバ側ではじかれたなど、想像することはできますが、通信周りは初心者なので、原因と対策がわかりません。
どのように改善すれば「http://hoge.sakura.ne.jp/index.html」へのアクセスも可能になるのか、そもそもできないのか?(なぜできないのか?)教えて頂けないでしょうか?

よろしくお願い致します。

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

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

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

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

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

risaito74

2016/11/02 13:30

はい、末尾にindex.htmlあり・なしどちらもアクセスできます。
guest

回答1

0

ベストアンサー

HTTP/1.1のHostリクエストフィールドを指定してアクセスするとどうでしょうか。

os.write("GET /index.html HTTP/1.1\r\n".getBytes()); os.write("Host: hoge.sakura.ne.jp\r\n".getBytes()); os.write("\r\n".getBytes()); os.flush();

投稿2016/11/02 13:52

ikedas

総合スコア4315

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

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

risaito74

2016/11/02 14:08

できました!ありがとうございます! ただ、dokojava.jpはHostリクエストフィールドが必要なく、sakuraは必要…というのはなぜかわかりませんが、さしあたり対処法としていただきます。ありがとうございました。
ikedas

2016/11/02 14:52

Sakuraは、Apacheで言えばNameVirtualHostにあたる設定をして、一台のサーバに一つのIPアドレスでたくさんのウェブサイトを提供しているのだとおもいます。Hostフィールドは、そういうときにも仮想ホストを区別できるようにするものです。
risaito74

2016/11/04 15:17

ご丁寧にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問