0

基本的なプロキシを作成しようとして、最初に次の行に沿ってコードを実装しました。

private Thread _proxyThread;

public void Start() 
{
    this._proxyThread = new Thread(StartListener);
    this._proxyThread.Start();
}

protected void StartListener(object data)
{
    this._listener = new TcpListener(IPAddress.Any, 1234);
    this._listener.Start();

    while (true)
    {
        TcpClient client = this._listener.AcceptTcpClient();

        while (client.Connected)
        {
            NetworkStream stream = client.GetStream();

            StringBuilder request = new StringBuilder();

            byte[] bytes = new byte[1024];

            while (stream.DataAvailable && stream.CanRead)
            {   
                int i = stream.Read(bytes, 0, bytes.Length);
                request.Append(System.Text.Encoding.ASCII.GetString(bytes, 0, i));                        
            }

            if (stream.CanWrite)
            {
                byte[] response = System.Text.Encoding.Default.GetBytes("HTTP/1.1 200 OK" + Environment.NewLine + "Content-length: 4\r\n\r\n" + "Test");
                stream.Write(response, 0, response.Length);
            }

            client.Close();
        }
    }
}

次に、LANプロキシを次のように設定します

プロキシー

私の現在の目標 (私のコードから推測できることを願っています) は、ヘッダーなどのないテキスト値のみを返すことです。

私が直面している問題は、コードをそのまま実行しようとすると、Chrome と IE9 が通常ERR_CONNECTION_ABORTEDを返すか、Internet Explorer がそれぞれ Web ページを表示できず、非常にまれに期待される出力を表示するという断続的な動作になることです。テスト"。

私はもともと非同期アプローチ (BeginAcceptTcpClient() を使用) を使用しようとしましたが、この問題は非同期実装で何かを間違って実行したことが原因である可能性があると考えたため、この単純な手法に戻りましたが、原因は別のようです。

誰でもガイダンスを提供してもらえますか?

4

2 に答える 2

1

ループの最初の繰り返しの後while (client.Connected)、接続を閉じます。すべてのデータの転送が完了したら、閉じてください。

于 2012-08-12T10:27:26.920 に答える
1

同期か非同期かではなく、適切な HTTP 応答で応答していないだけです。Fiddlerなどのツールを使用して、通常の Web ページを要求したときに受信されるデータを確認します。

これを返すと、うまくいくはずです:

HTTP/1.1 200 OK
Content-length: 4

TEST
于 2012-08-12T10:27:48.997 に答える