C# 使用套接字下载网站

C# 使用套接字下载网站,c#,.net,http,sockets,windows-phone-7,C#,.net,Http,Sockets,Windows Phone 7,我正在尝试使用套接字下载该站点的源代码。目前我可以下载头文件,然后我就终止连接,因为我不知道我应该接收多长时间的数据。代码如下: private void HandleConnect(SocketAsyncEventArgs e) { if (e.ConnectSocket != null) { // simply start sending bool completesAsynchronously

我正在尝试使用套接字下载该站点的源代码。目前我可以下载头文件,然后我就终止连接,因为我不知道我应该接收多长时间的数据。代码如下:

    private void HandleConnect(SocketAsyncEventArgs e)
    {
        if (e.ConnectSocket != null)
        {
            // simply start sending
            bool completesAsynchronously = e.ConnectSocket.SendAsync(e);

            // check if the completed event will be raised.
            // if not, invoke the handler manually.
            if (!completesAsynchronously)
            {
                SocketAsyncEventArgs_Completed(e.ConnectSocket, e);
            }
        }
    }

    private void HandleReceive(SocketAsyncEventArgs e)
    {
        string responseL = Encoding.UTF8.GetString(e.Buffer, 0, e.Buffer.Length);
        response += responseL;
        temp += responseL;

        string[] lines = Regex.Split(response, "\r\n\r\n");
        if (lines.Length > 1 && header == "")
        {
            header = lines[0].ToString() + "\r\n";
            lines[0] = "";
            response = lines.ToString();
        }
        if (header == "")
        {
            bool completesAsynchronously = e.ConnectSocket.ReceiveAsync(e);
        }
        else
        {
            System.Windows.Deployment.Current.Dispatcher.BeginInvoke(delegate()
            {
                _callback(false, this);
            });
        }
    }
我试图搜索\r\n,但没有帮助:/

请帮忙


提前感谢:)

也许,您应该使用
WebClient
HttpWebRequest
而不是sockets。
使用套接字和解释Http协议可能会很痛苦。

我使用此代码向站点发送标题,然后读取其内容。我希望你觉得它有用

        ReadStateObject stateObject; //Info below
        mytcpclient = new TcpClient();
        mytcpclient.Connect(host, port);
        mysocket = mytcpclient.Client;
        SendHeader(mysocket);//Info below
        ns = mytcpclient.GetStream();
        if (ns.CanRead)
        {
            stateObject = new ReadStateObject(ns, 1024);
            ns.BeginRead(stateObject.ReadBuffer, 0, stateObject.ReadBuffer.Length, new AsyncCallback(ReadCallBack), stateObject);
        }
StateObject是一个小类,用于表示BeginRead方法中的AsyncState对象:

class ReadStateObject
{
    public NetworkStream Stream {get; set;}
    public byte[] ReadBuffer;

    public ReadStateObject(NetworkStream _stream, int bufferSize)
    {
        Stream = _stream;
        ReadBuffer = new byte[bufferSize];
    }
}
这是BeginRead方法中使用的回调方法

    private void ReadCallBack(IAsyncResult result)
    {
        ReadStateObject stateObject = (ReadStateObject)result.AsyncState;
        NetworkStream myNetworkStream = stateObject.Stream;
        int numberofbytesread = 0;
        StringBuilder sb = new StringBuilder();
        numberofbytesread = myNetworkStream.EndRead(result);
        sb.Append(Encoding.ASCII.GetString(stateObject.ReadBuffer, 0, numberofbytesread));

        /*It seems, if there is no delay, the DataAvailable may not be true even when there are still data to be received from the site, so I added this delay. Any suggestions, how to avoid this are welcome*/

        Thread.Sleep(500);

            while (myNetworkStream.DataAvailable)
            {
                byte[] mydata = new byte[1024];
                numberofbytesread = myNetworkStream.Read(mydata, 0, mydata.Length);
                sb.Append(Encoding.ASCII.GetString(mydata, 0, numberofbytesread)); 

            }

      Console.Writeln(sb.ToString());
        mytcpclient.Close();
    }
这是头被发送到站点的地方

    public void SendHeader(Socket mySocket)
    {
        String sBuffer = "";
        sBuffer = sBuffer + "GET /"+pathquery+" HTTP/1.1" + "\r\n";
        sBuffer = sBuffer + "Host: "+ hostname + "\r\n";
        sBuffer = sBuffer + "Content-Type: text/html\r\n";
        sBuffer = sBuffer + "\r\n";
        Byte[] bSendData = Encoding.ASCII.GetBytes(sBuffer);
        mySocket.Send(Encoding.ASCII.GetBytes(sBuffer), Encoding.ASCII.GetBytes(sBuffer).Length, 0);
    }

我必须完全控制我发送的标题。HttpWebRequest可以完全控制标题。HttpWebRequest可以完全控制标题。你认为用HttpWebRequest做不到的事情是什么?@McKay:不是真的:1)试着让Keep Alive更像“Keep Alive”。2) 尝试重新排列发送标头的顺序。在大多数情况下,这没有什么区别,但在少数选定的情况下确实如此。最后,我编写了自己的类来使用套接字处理它,但感谢您的关注。