TcpListener间歇性地无法正常工作

时间:2012-08-12 10:22:42

标签: c# http proxy tcplistener

尝试编写基本代理我已经按照以下几行实现了代码作为开始。

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代理

Proxy

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

如果你返回它,它应该有效:

HTTP/1.1 200 OK
Content-length: 4

TEST