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

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

ただいまの
回答率

90.37%

  • C#

    9485questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • HTML5

    5454questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

TCPサーバーを作成し、接続されたらHelloWorldと表示されるようにしたいです。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,802

57svu

score 14

いつもお世話になっています。
C#でTCPサーバーを作成し
ブラウザ(GoogleChrome)から
IPアドレスと指定のポート番号(127.0.0.1:2001)
を叩くと"HelloWorld"とブラウザで表示するように
接続できた場合のサーバーが返すHTMLを追加したいのですが、
既存のコードのどこに追加すればいいのかがわからないです。
既存のコードがこちらです ↓

//  ListenするIPアドレス
            string ipString = "127.0.0.1";
            System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse(ipString);

            //  ホスト名からIPアドレスを取得する時は、以下のようにする
            // string host = "localhost";
            //  Sysytem.Net.IPAddress ipAdd = 
            //      System.Net.Dns.GetHostEntry(host).AddressList[0];
            //  .NET Framework 1.1以前では、以下のようにする
            //  System.Net.IPAddress ipAdd = 
            //      System.Net.Dns.Resolve(host).AddressList[0];

            //  Listenするポート番号
            int port = 2001;

            //  TcpListenrオブジェクトを作成する

            System.Net.Sockets.TcpListener listener =
                new System.Net.Sockets.TcpListener(ipAdd, port);

            //  Listenを開始する
            listener.Start();

            Console.WriteLine("Listenを開始しました({0} : {1})。",
                ((System.Net.IPEndPoint)listener.LocalEndpoint).Address,
                ((System.Net.IPEndPoint)listener.LocalEndpoint).Port);

            //  接続要求があったら受け入れる
            System.Net.Sockets.TcpClient client = listener.AcceptTcpClient();
            Console.WriteLine("クライアント({0} : {1})と接続しました。",
                ((System.Net.IPEndPoint)listener.LocalEndpoint).Address,
                ((System.Net.IPEndPoint)listener.LocalEndpoint).Port);

            //  NetworkStreamを取得
            System.Net.Sockets.NetworkStream ns = client.GetStream();

            //  読み取り、書き込みのタイムアウトを10秒にする
            // デフォルトはInfiniteで、タイムアウトしない
            // (.NET Framework 2.0以上が必要)
            ns.ReadTimeout = 10000;
            ns.WriteTimeout = 10000;

            //  クライアントから送られてきたデータを受信する
            System.Text.Encoding enc = System.Text.Encoding.UTF8;
            bool disconnected = false;
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            byte[] resBytes = new byte[256];
            int resSize = 0;
            do{
                //  データの一部を受信する
                resSize = ns.Read(resBytes, 0, resBytes.Length);
                //  Readが0を返した時はクライアントが切断したと判断
                if (resSize == 0){
                    disconnected = true;
                    Console.WriteLine("クライアントが切断しました。");
                    break;
                }
                //  受信したデータを蓄積する
                ms.Write(resBytes, 0, resSize);
                //  まだ読み取れるデータがあるかどうか、データの最後が\nでない場合
                // 受信を続ける
            } while(ns.DataAvailable || resBytes[resSize - 1] != '\n');
            //  受信したデータを文字列に変換
            string resMSG = enc.GetString(ms.GetBuffer(), 0, (int)ms.Length);
            ms.Close();
            //  末尾の\nを削除
            resMSG = resMSG.Trim('\n');
            Console.WriteLine(" ここが受信した文字列をデータに変換したもの:"+resMSG);

            if(!disconnected){
                // クライアントにデータを送信する

                // クライアントに送信する文字列を作成
                string sendMSG = resMSG.Length.ToString();
                //  文字列をByte型配列に変換
                byte[] sendBytes = enc.GetBytes(sendMSG + '\n');
                //  データを送信する
                ns.Write(sendBytes, 0, sendBytes.Length);
                Console.WriteLine("データをクライアントに送信:"+ sendMSG);
            }

            //  閉じる
            ns.Close();
            client.Close();
            Console.WriteLine("クライアントとの接続を閉じました。");

            //  リスナを閉じる
            listener.Stop();
            Console.WriteLine("Listenerを閉じました。");

            Console.ReadLine();

最後の方の

if(!disconnected){
                // クライアントにデータを送信する

                // クライアントに送信する文字列を作成
                string sendMSG = resMSG.Length.ToString();
                //  文字列をByte型配列に変換
                byte[] sendBytes = enc.GetBytes(sendMSG + '\n');
                //  データを送信する
                ns.Write(sendBytes, 0, sendBytes.Length);
                Console.WriteLine("データをクライアントに送信:"+ sendMSG);
            }


この箇所が接続したときに値を返すメソッドなんだろうなと感じてはいます

アドバイス頂ければ幸いです。
宜しくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+8

単なるTCPサーバでは、ブラウザが結果を解釈できません。HTTPとしての通信ができるように改造する必要があります。となると、3つの要素を実装する必要が出てきます。

  • HTTPリクエストを解釈する
  • HTTPレスポンスヘッダを生成する
  • 本文を生成する

どれもこれも、ここに書くには長くなりすぎます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/02 00:04


    string sendMSG = resMSG.Length.ToString()の引数に
    HTTP/1.0 ¥n Contents-Length : 12 ¥n ¥n Hello World! とし、レスポンスヘッダーと本文を挿入したところ、IEではアクセス成功し、サーバーから挨拶がかえってきました!
    ありがとうございました😊

    キャンセル

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

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

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

  • C#

    9485questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • HTML5

    5454questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。