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

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

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

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

C#

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

Q&A

解決済

1回答

5792閲覧

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

57svu

総合スコア28

HTML5

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

C#

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

0グッド

0クリップ

投稿2017/06/01 06:20

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

c#

1 2// ListenするIPアドレス 3 string ipString = "127.0.0.1"; 4 System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse(ipString); 5 6 // ホスト名からIPアドレスを取得する時は、以下のようにする 7 // string host = "localhost"; 8 // Sysytem.Net.IPAddress ipAdd = 9 // System.Net.Dns.GetHostEntry(host).AddressList[0]; 10 // .NET Framework 1.1以前では、以下のようにする 11 // System.Net.IPAddress ipAdd = 12 // System.Net.Dns.Resolve(host).AddressList[0]; 13 14 // Listenするポート番号 15 int port = 2001; 16 17 // TcpListenrオブジェクトを作成する 18 19 System.Net.Sockets.TcpListener listener = 20 new System.Net.Sockets.TcpListener(ipAdd, port); 21 22 // Listenを開始する 23 listener.Start(); 24 25 Console.WriteLine("Listenを開始しました({0} : {1})。", 26 ((System.Net.IPEndPoint)listener.LocalEndpoint).Address, 27 ((System.Net.IPEndPoint)listener.LocalEndpoint).Port); 28 29 // 接続要求があったら受け入れる 30 System.Net.Sockets.TcpClient client = listener.AcceptTcpClient(); 31 Console.WriteLine("クライアント({0} : {1})と接続しました。", 32 ((System.Net.IPEndPoint)listener.LocalEndpoint).Address, 33 ((System.Net.IPEndPoint)listener.LocalEndpoint).Port); 34 35 // NetworkStreamを取得 36 System.Net.Sockets.NetworkStream ns = client.GetStream(); 37 38 // 読み取り、書き込みのタイムアウトを10秒にする 39 // デフォルトはInfiniteで、タイムアウトしない 40 // (.NET Framework 2.0以上が必要) 41 ns.ReadTimeout = 10000; 42 ns.WriteTimeout = 10000; 43 44 // クライアントから送られてきたデータを受信する 45 System.Text.Encoding enc = System.Text.Encoding.UTF8; 46 bool disconnected = false; 47 System.IO.MemoryStream ms = new System.IO.MemoryStream(); 48 byte[] resBytes = new byte[256]; 49 int resSize = 0; 50 do{ 51 // データの一部を受信する 52 resSize = ns.Read(resBytes, 0, resBytes.Length); 53 // Readが0を返した時はクライアントが切断したと判断 54 if (resSize == 0){ 55 disconnected = true; 56 Console.WriteLine("クライアントが切断しました。"); 57 break; 58 } 59 // 受信したデータを蓄積する 60 ms.Write(resBytes, 0, resSize); 61 // まだ読み取れるデータがあるかどうか、データの最後が\nでない場合 62 // 受信を続ける 63 } while(ns.DataAvailable || resBytes[resSize - 1] != '\n'); 64 // 受信したデータを文字列に変換 65 string resMSG = enc.GetString(ms.GetBuffer(), 0, (int)ms.Length); 66 ms.Close(); 67 // 末尾の\nを削除 68 resMSG = resMSG.Trim('\n'); 69 Console.WriteLine(" ここが受信した文字列をデータに変換したもの:"+resMSG); 70 71 if(!disconnected){ 72 // クライアントにデータを送信する 73 74 // クライアントに送信する文字列を作成 75 string sendMSG = resMSG.Length.ToString(); 76 // 文字列をByte型配列に変換 77 byte[] sendBytes = enc.GetBytes(sendMSG + '\n'); 78 // データを送信する 79 ns.Write(sendBytes, 0, sendBytes.Length); 80 Console.WriteLine("データをクライアントに送信:"+ sendMSG); 81 } 82 83 // 閉じる 84 ns.Close(); 85 client.Close(); 86 Console.WriteLine("クライアントとの接続を閉じました。"); 87 88 // リスナを閉じる 89 listener.Stop(); 90 Console.WriteLine("Listenerを閉じました。"); 91 92 Console.ReadLine(); 93

最後の方の

c#

1if(!disconnected){ 2 // クライアントにデータを送信する 3 4 // クライアントに送信する文字列を作成 5 string sendMSG = resMSG.Length.ToString(); 6 // 文字列をByte型配列に変換 7 byte[] sendBytes = enc.GetBytes(sendMSG + '\n'); 8 // データを送信する 9 ns.Write(sendBytes, 0, sendBytes.Length); 10 Console.WriteLine("データをクライアントに送信:"+ sendMSG); 11 }

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

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

投稿2017/06/01 06:36

maisumakun

総合スコア145183

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

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

57svu

2017/06/01 15:04

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問