TcpListener クラスを使用して、C# で独自の http Web サーバーをコーディングしています。誰かがこれについて言及する前に、私は HttpListener を知っていますが、以前にそれを使用した後、ファイアウォールの例外や管理者アカウントの必要性などのためにいくつかの問題がありました。シンプルな構築済み Web サーバー。私はPythonアプリケーションを使用してC#Webサーバーに接続し、単純なGETリクエストを送信し、単純な応答を受け取りました。
私の質問はこれです..サーバーは接続を閉じることになっていますか、それともクライアントですか? 応答を送信した後にサーバーで接続を閉じると、Python アプリが常にすべての応答を読み取るとは限らないためです。代わりに、「エラー 10054、「ピアによって接続がリセットされました」」というソケット エラーがスローされます。しかし、Python アプリに強制的に接続を閉じると、C# TcpClient には切断イベントが含まれていないため、C# サーバーでそれを検出する方法がわかりません。それで、私は何をしますか?接続されたクライアントが完全な応答を受信したことを確認して、接続を閉じるにはどうすればよいですか?
現在、これは機能します(スレッドスリープで)
// Write headers and body to the Socket
NetworkStream Stream = Client.GetStream();
// Write Headers
byte[] Buffer = Encoding.UTF8.GetBytes(Headers);
Stream.Write(Buffer, 0, Buffer.Length);
// Write Response Data if Request method is not HEAD
if (Request.RequestMethod != HttpRequestMethod.HEAD)
Stream.Write(BodyByteArr, 0, BodyByteArr.Length);
Stream.Flush();
System.Threading.Thread.Sleep(100);
Stream.Close();
Client.Close();
Thread.Sleep() よりも優れた代替手段が必要だと思いますが、クライアントが応答を受信するのにスリープ時間よりも時間がかかる場合はおそらく機能しません (接続が遅い)
HTTP サーバーに送信されるヘッダー:
GET /test HTTP/1.1
Host: 127.0.0.1
Connection: close
クライアントに送り返されるヘッダー:
HTTP/1.1 200 OK
Date: {Now}
Server: MiniHttp-ASPServer
Content-Type: text/plain; charset=utf-8
Content-Length: {length}
Connection: close
{contents}