1

世界!.Net Framework 4 System.Net.Sockets.TcpClientを使用して単純な HTML サーバーを作成しています。

StringBuilder htmlにHTML があり、テキストが含まれています。例えば:

<div id="RequestText">

    GET / HTTP/1.1<br/>Host: localhost:90<br/>Connection: keep-alive<br/>Cache-Control: max-age=0<br/>User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11<br/>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<br/>Accept-Encoding: gzip,deflate,sdch<br/>Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4<br/>Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3

</div>

テキストはさまざまです。クライアントに応答を送信するとき

private static void SendResponseToClient(NetworkStream clientStream, StringBuilder html)
    {
        String data = _htmlHeader + html.Length.ToString() + "\n\n" + html; // The "data" is OK!
        Byte[] buffer;
        buffer = Encoding.UTF8.GetBytes(data); // !UTF8
        clientStream.Write(buffer, 0, buffer.Length);
    }

Google Chrome を使用しており、 Encoding.UTF8の場合、表示されたページのテキストの一部が失われます。末尾の「indows-1251,utf-8;q=0.7,*;q=0.3」がカットされています。失われた部分の後の HTML テキストの残りの部分はまだ残っています。Encoding.ASCIIを使用すると、すべて問題ありません。理由のアイデアはありますか?

4

2 に答える 2

3

あなたが示した限られたコードに基づいて、これは単なる推測ですが、あなたの使用は、あなたの変数にヘッダーで終わるHTTPヘッダーが含まれており、そのヘッダーを完成させるために使用されていることをhtml.Length.ToString()示唆しています. これが true の場合、クライアントに間違った値を送信しているため、クライアント側のソケットから間違ったバイト数を読み取ることになります。ヘッダーは、送信されるバイト数を指定します。を、代わりに送信するUTF-8 でエンコードされたバイト数に設定する必要があるときに、にある UTF-16 でエンコードされた文字数に設定しています。_htmlHeaderContent-Lengthhtml.Length.ToString()LengthContent-LengthContent-LengthStringBuilder

これを試して:

private static void SendResponseToClient(NetworkStream clientStream, StringBuilder html)
{
    Byte[] html_buffer = Encoding.UTF8.GetBytes(html.ToString());

    // HTTP does not support non-ASCII characters in headers.
    Byte[] http_buffer = Encoding.ASCII.GetBytes(_htmlHeader + html_buffer.Length.ToString() + "\n\n");

    clientStream.Write(http_buffer, 0, http_buffer.Length);
    clientStream.Write(html_buffer, 0, html_buffer.Length);
}

もちろん、クライアントが UTF-8 でエンコードされた HTML を正しく処理できるよう_htmlHeaderに、ヘッダーが含まれていることを確認してください。Content-Type: text/html; charset=utf-8

于 2012-09-15T01:23:42.763 に答える
0

推測するだけです...しかし、おそらくUTF-8エンコーディングはテキストをエンコードするためにASCIIよりも多くのバイトを使用しています(おそらく、ASCIIは単に ? またはそのようなものを使用するのに対し、一部の文字は2バイトでエンコードされます)したがって、最大メッセージの長さを超えていますか?

于 2012-09-14T08:54:19.630 に答える