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

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

ただいまの
回答率

88.04%

JavaでTCPサーバーのみを作成し、ブラウザでアクセスした時に文字列を返したい

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,769

score 20

いつもお世話になっています。
TCPサーバーを作成し、ブラウザにてローカルホストとポート番号を叩くと、Hello Worldと表示されるようにしたいのですが
行き詰っております。

また参考にしてるサイトの構文を模写し、まずは動かしてみようと思ったのですがこれもうまくいきません。
参考サイトではアクセスがあった時に日付を表示する仕様なので、そこをいじって、stringのHelloWorldを差し込んでみたのですが....
反応がありません。

現状では、eclipseではエラーはありませんが
ブラウザでアクセスした際に、ブラウザでは画面が表示されずに、ずっとバッファリング?丸印が回っています。
コンソールではgetリクエストが表示されています。
クライアントからの接続を待ちます。クライアント接続
GET / HTTP/1.1
Host: 127.0.0.1:9009
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br

このような表示です。

ご指導ご鞭撻のほど宜しくお願い致します。

以下が作成したコードです。

package tcpServer;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer extends ServerSideTestByJava {

        public static void main(String[] args) throws IOException {

            //  サーバーソケットクラスの listener を生成 引数でポート番号を指定
            ServerSocket listener = new ServerSocket(9009);
            //  try catch構文で実行
            try {
                while(true){

                    System.out.println("クライアントからの接続を待ちます。");
                    //  ソケットクラスのsocketを生成
                    //  内容はアクセスがあるまでクラスserverのアクセプトメソッドにて待ち続けます
                    Socket socket = listener.accept();

                try{
                        System.out.println("クライアント接続");
                        //  クライアントから受け取った内容をインプットストリームクラスinputに格納
                        InputStream input = socket.getInputStream();

                        String sayHello = "Hello , World!";

                        //  以下が模写部分
                        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                        out.println(sayHello);
                        //  模写終わり

                        //  バッファリングリーダークラスのinputNeoを生成
                        //  内容はクライアントから受け取った情報の全て
                          BufferedReader inputNeo =
                          new BufferedReader(new InputStreamReader(socket.getInputStream()));

                        //  文字列 answerを定義 内容はクライアントから受け取った情報の①行
                          String answer = inputNeo.readLine();

                        //  クライアントから受け取った内容の行がnullになるまで繰り返す
                          while (answer  != null){

                            //  内容の①行を出して改行
                              System.out.println(answer);

                            //  文字列一行answerのstringに
                            //  クライアントから受け取った情報の一行が格納される
                              answer = inputNeo.readLine();

                          }

                } finally{
                    socket.close();
            }
        }
            } finally {
                listener.close();
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

以前の質問の時と同じで、ブラウザにhttp://と打ち込んでいるようにHTTPによる通信を期待しているわけですから、HTTPに則ったやり取りをしなければ、ブラウザで使えません

もちろん、Telnetなど単なるターミナルからつなぐとか、ブラウザ以外のクライアントに返すとかであれば、好きな方法で実装して構いません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/05 16:06

    ご指摘ありがとうございます。
    ということは、httpレスポンスを作成する作業が必要になるということでしょうか。
    そして、参考サイトなどのTCPサーバーで文字列を表示したりするのは、クライアントを作成しているためにそのまま文字列が表示されるということでしょうか...

    キャンセル

  • 2017/06/05 16:12

    TCPサーバーの場合、Telnetなど「通信だけで済む」ような環境からアクセスしているんだと思います。

    キャンセル

  • 2017/06/05 16:44

    環境が違うのですね。
    ちなみにHTTPレスポンスで調べていると
    この場合、サーブレットを使うべきなのでしょうか。

    キャンセル

0

HTTP get メソッドは取得できたので
レスポンスを返すのみ

そこでレスポンスの構成
ステータスコード
ヘッダー
空行
ボディ

が必要

その前にBufferedWriter outputを作成し
Output.write(Sting str);
と追記しました
strの中身は

"HTTP / 1.1 200 OK ¥n"
+ "Contents-Length: 14"
+ "¥n"
+ "¥n"
+ "Hello , World!";
です
形式を変更したのですが
依然反応はありません
ただ再度更新すると
コンソール画面には
レスポンス文の内容が表示されます
ブラウザに表示させたいです,

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る