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

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

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

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Q&A

1回答

825閲覧

C#, TCPのソケット通信に関して

DDama28

総合スコア0

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

0グッド

0クリップ

投稿2023/04/20 15:49

編集2023/04/23 09:58

実現したいこと

・クライエント側のブラウザに"Hello, client!"を表示させる(webアプリ作成)。
(クライエントがサーバー側のフォルダにある画像ファイルから表示したい画像のファイル名をリクエストし、受信した画像をクライアント側のブラウザに表示する。最終的には、中間にキャッシュサーバーを置き、サーバーからのレスポンスタイムを短くすることが目的になります。

前提

Mac.OS
Visual Studio
C#
.NET 7
TCP Listener/Client
NetWorkStream

この課題は、V Sを活用してC#、.NET 7、TCP Listener/Clientを用いたプログラムを作ることだけで、テンプレートの指示はされておりません。

自分自身、C#, VSは一度も使ったことがなく、いろんなサイトを調べていますが、MacのV Sでこのようなアプリの参考があまり見つけられなかったため、独自でアプリを構築しているところでした。
もし、アドバイスやご存じの参考サイト等ございましたら、ご教示いただけると幸いです。

発生している問題・エラーメッセージ

エラーメッセージ

"HT" あるいは"HTTP1.1"が表示される。

該当のソースコード

イメージ説明
<クライアント側:Index.cs.html.cs>

C#

1using System; 2using System.Collections.Generic; 3using System.Diagnostics; 4using System.IO.Compression; 5using System.Linq; 6using System.Net; 7using System.Net.Sockets; 8using System.Text; 9using Microsoft.AspNetCore.Mvc; 10using Microsoft.AspNetCore.Mvc.RazorPages; 11 12 13namespace client.Pages 14{ 15 public class IndexModel : PageModel 16 { 17 private readonly ILogger<IndexModel> _logger; 18 19 public List<string> receiveList { get; set; } = new List<string>(); 20 public List<string> receiveImage { get; set; } = new List<string>(); 21 22 23 public IndexModel(ILogger<IndexModel> logger) 24 { 25 _logger = logger; 26 } 27 28 public void OnGet() 29 { 30 receiveList = getList(); 31 receiveImage = downloadImage(); 32 33 _logger.LogInformation("Response: {@Response}", receiveList); 34 } 35 36 37 public List<string> getList() 38 { 39 List<string> responseArray = new List<string>(); 40 byte[] buffer = new byte[1024 * 8]; 41 42 try 43 { 44 var client = new TcpClient(); 45 client.Connect("localhost", 8081); 46 47 var stream = client.GetStream(); 48 // request 49 buffer = Encoding.UTF8.GetBytes("hi"); 50 stream.Write(buffer, 0, buffer.Length); 51 52 // response 53 var length = stream.Read(buffer, 0, buffer.Length); 54 var response = Encoding.UTF8.GetString(buffer, 0, length); 55 responseArray.Add(response); 56 57 client.Close(); 58 } 59 catch (Exception ex) 60 { 61 responseArray.Add($"Error occurred: {ex.Message}"); 62 } 63 64 return responseArray; 65 } 66 } 67}

<サーバー側:Program.cs>

C#

1using Microsoft.AspNetCore.Hosting; 2using Microsoft.Extensions.Hosting; 3using Microsoft.AspNetCore.Http; 4using Microsoft.Extensions.DependencyInjection; 5using System; 6using System.Net; 7using System.Net.Sockets; 8using System.Text; 9 10public class Program 11{ 12 public static void Main(string[] args) 13 { 14 createBuilder(args); 15 16 TcpListener server = new TcpListener(IPAddress.Any, 8081); 17 server.Start(); 18 19 while (true) 20 { 21 TcpClient client = server.AcceptTcpClient(); 22 23 HandleConnection(client); 24 25 client.Close(); 26 server.Stop(); 27 } 28 } 29 30 private static void HandleConnection(TcpClient client) 31 { 32 List<string> fileList = new List<string>(); 33 34 using (NetworkStream stream = client.GetStream()) 35 { 36 // Receive data 37 byte[] buffer = new byte[1024 * 8]; 38 int byteSize = stream.Read(buffer, 0, buffer.Length); 39 string request = Encoding.UTF8.GetString(buffer, 0, byteSize); 40 41 if (request == "hi") 42 { 43 // Send the list of file 44 StreamWriter writer = new StreamWriter(stream, Encoding.UTF8); 45 var response = "Hello, client!"; 46 47 writer.Write(response); 48 } 49 //else 50 //{ 51 // // Send an error message 52 // byte[] errorHeader = Encoding.UTF8.GetBytes("error:Invalid request"); 53 54 // stream.Write(errorHeader, 0, errorHeader.Length); 55 //} 56 } 57 } 58 59 60 public static void createBuilder(string[] args) 61 { 62 // Add services to the container. 63 var builder = WebApplication.CreateBuilder(args); 64 builder.Services.AddRazorPages(); 65 66 var app = builder.Build(); 67 68 // Configure the HTTP request pipeline. 69 if (!app.Environment.IsDevelopment()) 70 { 71 app.UseExceptionHandler("/Error"); 72 // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 73 app.UseHsts(); 74 } 75 76 app.UseHttpsRedirection(); 77 app.UseStaticFiles(); 78 79 app.UseRouting(); 80 81 app.UseAuthorization(); 82 83 app.MapRazorPages(); 84 85 app.Run(); 86 87 } 88}

試したこと

IPアドレス、ポート番号の変更
MVCでの設計

補足情報(FW/ツールのバージョンなど)

この課題がC#、.NET 7、TCP Listener/Clientを使うことが条件のため、他のソケット通信は試していません。
Firewallはオフにして、すべてのコネクトを受け入れられるように設定しています。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2023/04/20 23:25 編集

> 本来の目的は、クライエントがサーバー側のフォルダにある画像ファイルから表示したい画像のファイル名をリクエストし、ファイルを取得する > この課題がC#、.NET 7、TCP Listener/Clientを使うことが条件 Web サーバーを作ることが目的ですか? そうであれば、Visual Studio でプロジェクトを作成する際選んだテンプレートが間違っているのでは? 質問に書いてあった画像、コードを見ると、ASP.NET Core Razor Pages アプリのものです。 それは Web サーバー (Mac だとたぶん Kestrel) で動かすためのものです。 課題だそうですが、テンプレートは講師の指示ですか?
DDama28

2023/04/21 04:27 編集

お忙しい中、コメントいただきありがとうございます。 > Web サーバーを作ることが目的ですか? おっしゃる通りです。最終的には、中間にキャッシュサーバーを置き、サーバーからのレスポンスタイムを短くすることがこの課題の最大の目的になります。 > テンプレートは講師の指示ですか? テンプレートの指示はされておりません。ただ、教授からの指示は、V Sを活用してC#、.NET 7、TCP Listener/Clientを用いたプログラムを作ることだけでした。 この課題が出ている授業はアルゴリズムの学習で、C#の習得ではないため困惑しております。C#, VSは一度も使ったことがなく、いろんなサイトを調べていますが、MacのV Sでこのようなアプリの参考があまり見つけられなかったため、独自でアプリを構築しているところでした。 もし、アドバイスやご存じの参考サイト等ございましたら、ご教示いただけると幸いです。
退会済みユーザー

退会済みユーザー

2023/04/21 05:31

上のコメントで書かれたことは有用な追加情報ですので質問欄を編集して追記願います
DDama28

2023/04/21 05:49

ご指摘いただきありがとうございます。
退会済みユーザー

退会済みユーザー

2023/04/21 05:52

上にも書きましたが、質問に書いてあった画像、コードを見ると、ASP.NET Core Razor Pages アプリのもので、Web サーバーを作ることが目的だとすると、選択が間違ってます。はっきり言って全くの見当違いです。 ググると以下のような記事が見つかりますが、HTTP レイヤーでの実装の話で、TCP レイヤーまで下りてきて実装するような記事は、ちょっと探しただけですが、見当たりません。 簡易Webサーバを実装するには?[2.0のみ、C#、VB] https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/695httplistener/httplistener.html > アドバイスやご存じの参考サイト等ございましたら、ご教示いただけると幸いです。 講師に聞きましょう。そもそも研修の課題の質問はここで聞きべき話ではないと思います。
Zuishin

2023/04/21 07:12

クライエント側にブラウザという表現がありますが、ブラウザと言えばウェブブラウザを指すのが一般的です。 これは TcpServer はともかく、TcpClient を使えという指示と競合する気がします。 同じく、ウェブアプリというのが教授側から出された言葉であるなら、これは http を実装せよという指示のように見えます。 もう一度課題を確認した方が良いのではないでしょうか。 前提知識として、ip tcp http という三つの p(プロトコル)が何を意味するのかを頭に入れていないと厳しいと思います。
退会済みユーザー

退会済みユーザー

2023/04/23 00:58

質問者さん、スレッドを放置しておかないでクローズしてください。質問を継続したいならその限りではありませんが、そういうことではないですよね。
guest

回答1

0

Web サーバーを作ることが目的ですか?

おっしゃる通りです。最終的には、中間にキャッシュサーバーを置き、サーバーからのレスポンスタイムを短くすることがこの課題の最大の目的になります。

プロキシサーバー(またはそれに準ずる Web サーバー?)を、TCP レイヤーまで下りてきて開発したいという話だと理解しました。

質問に書いてあった画像やコードを見ると、Visual Studio でプロジェクトを作成する際選んだテンプレートは ASP.NET Core Razor Pages アプリのものです。

ASP.NET Core Razor Pages アプリは Web サーバー(IIS や Kestrel)上で動く Web アプリケーションです。

プロキシサーバーを TCP レイヤーまで下りてきて開発することが目的だとすると、選択が間違ってます。はっきり言わせてもらえると全くの見当違いだと思います。

アドバイスやご存じの参考サイト等ございましたら、ご教示いただけると幸いです。

「c# web サーバー開発」などをキーワードにググると以下のような記事が見つかりますが、HTTP レイヤーでの実装の話で、TCP レイヤーまで下りてきて実装するような記事は、ちょっと探しただけですが、見当たりません。

簡易Webサーバを実装するには?[2.0のみ、C#、VB]
https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/695httplistener/httplistener.html

自分でもググって探してみてください。

それより、教授が出した課題のアドバスは教授に求めるのが良いのではないですか? そもそも研修などの課題の質問は教授・講師に聞くのが筋で、ここで聞きべき話ではないと思います。

投稿2023/04/21 06:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

DDama28

2023/04/21 06:46

お忙しいところ、ご丁寧にご回答いただきありがとうございます。授業が始まったばかりで、何も理解していない状態でした。まずは専門的な用語から理解する学習をしたいと思います。その後、ご教授いただいように、検索と実行してみようと思います。
退会済みユーザー

退会済みユーザー

2023/04/21 09:52 編集

質問に対するコメント欄の Zuishin さんのコメントにありますように、教授に課題をしっかり確認した方が良さそうです。失礼ながら、質問者さんが理解してない可能性が高そうな気がしますので。 > クライエント側のブラウザに"Hello, client!"を表示させる(webアプリ作成) それは Web アプリの守備範囲です。Visual Studio + ASP.NET Core Razor Pages アプリで難なく可能です。 > クライエントがサーバー側のフォルダにある画像ファイルから表示したい画像のファイル名をリクエストし、受信した画像をクライアント側のブラウザに表示する。 それも Web アプリの守備範囲です。Visual Studio + ASP.NET Core Razor Pages アプリで難なく可能です。 IIS などの Web サーバー単独でも、ブラウザの要求に応じてサーバーの画像フォルダのファイル一覧を表示して、それをクリックするとその画像を表示するということはできますが。 > 最終的には、中間にキャッシュサーバーを置き、サーバーからのレスポンスタイムを短くすることが目的になります。 それはプロキシサーバーの機能で、前の 2 つとは異なものです。 ・・・というわけで、教授の求めているのが何なのか、よく確認した方がいいと思います。 特に「TCP Listener/Clientを用いたプログラムを作る」というところが意味不明なところで、そのあたりの確認が必要かと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問