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();
        }
    }
}

然后我像这样设置我的局域网代理

代理人

我当前的目标(希望您可以从我的代码中推断出)是只返回一个没有标题或任何内容的文本值。

我遇到的问题是,我按原样运行代码的任何尝试都会导致间歇性行为,Chrome 和 IE9 通常只会返回ERR_CONNECTION_ABORTEDInternet Explorer 无法分别显示网页,并且偶尔会显示预期的输出“测试”。

我最初尝试使用异步方法(使用 BeginAcceptTcpClient()),但又回到了这种更简单的技术,因为我认为这个问题可能源于我在异步实现中做错了什么,但似乎原因是别的。

有人可以提供任何指导吗?

4

2 回答 2

1

在循环的第一次迭代之后,while (client.Connected)您关闭连接。仅在完成所有数据传输后关闭它。

于 2012-08-12T10:27:26.920 回答
1

不是同步的还是异步的,你只是没有用正确的 HTTP 响应来响应。使用Fiddler之类的工具,查看请求常规网页时收到的数据。

如果你返回这个,它应该可以工作:

HTTP/1.1 200 OK
Content-length: 4

TEST
于 2012-08-12T10:27:48.997 回答