使用套接字下载网站

时间:2011-10-09 20:43:55

标签: c# .net http sockets windows-phone-7

我正在尝试使用套接字下载网站的源代码。目前我可以下载标题,然后我只是终止连接,因为我不知道我应该收到多长时间的数据。这是代码:

    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但它没有帮助:/

请帮忙!

提前谢谢你:)

2 个答案:

答案 0 :(得分:3)

我使用此代码将标头发送到网站,然后阅读其内容。我希望你觉得它很有用。

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

这就是Headers被发送到网站的地方

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

答案 1 :(得分:1)

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