2

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}
4

2 に答える 2

0

h[ttp://msdn.microsoft.com/en-us/library/w89fhyex.aspx][1] にある同期および非同期ソケットのサンプルをご覧になりましたか?

[1]: http://msdn.microsoft.com/en-us/library/w89fhyex.aspx ?

ロジックの一部をソリューションに組み込むことができると思います。同期サーバーの例 (スニペット) では:

       while (true) {
            Console.WriteLine("Waiting for a connection...");
            // Program is suspended while waiting for an incoming                      connection.
            Socket handler = listener.Accept();
            data = null;

            // An incoming connection needs to be processed.
            while (true) {
                bytes = new byte[1024];
                int bytesRec = handler.Receive(bytes);
                data += Encoding.ASCII.GetString(bytes,0,bytesRec);
                if (data.IndexOf("<EOF>") > -1) {
                    break;
                }
            }

            // Show the data on the console.
            Console.WriteLine( "Text received : {0}", data);

            // Echo the data back to the client.
            byte[] msg = Encoding.ASCII.GetBytes(data);

            handler.Send(msg);
            handler.Shutdown(SocketShutdown.Both);
            handler.Close();
        }

クライアント側:

         sender.Connect(remoteEP);

            Console.WriteLine("Socket connected to {0}",
                              sender.RemoteEndPoint.ToString());

            // Encode the data string into a byte array.
            byte[] msg = Encoding.ASCII.GetBytes("This is a test<EOF>");

            // Send the data through the socket.
            int bytesSent = sender.Send(msg);

            // Receive the response from the remote device.
            int bytesRec = sender.Receive(bytes);
            Console.WriteLine("Echoed test = {0}",
                                Encoding.ASCII.GetString(bytes,0,bytesRec));

            // Release the socket.
            sender.Shutdown(SocketShutdown.Both);
            sender.Close();
于 2013-07-31T14:09:03.997 に答える