4

TCP ストリーム経由でページに GET リクエストを送信しようとしています。

私のコードは次のようになります。

public class SocketLevelWebClient
{
    public string SendWebRequest(string url, string request)
    {
        using(TcpClient tc = new TcpClient())
        {
            tc.Connect(url, 80);

            using (NetworkStream ns = tc.GetStream())
            {
                using (System.IO.StreamWriter sw = new System.IO.StreamWriter(ns))
                {
                    using (System.IO.StreamReader sr = new System.IO.StreamReader(ns))
                    {
                        sw.Write(request);
                        sw.Flush();
                        return sr.ReadToEnd();
                    }
                }
            }
        }
    }

そしてリクエスト自体:

            SocketLevelWebClient wc = new SocketLevelWebClient();
            var r=wc.SendWebRequest("www.youtube.com",@"GET http://www.youtube.com/ HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: www.youtube.com"+"\r\n\r\n");

このコードを呼び出すと、サーバーからの応答を待って常にフリーズします。

私は何を間違っていますか?

4

2 に答える 2

5

問題はReadToEnd、ストリームが終了したときにのみ戻ることです。残念ながら、サーバーは TCP 接続を維持します。そのためReadToEnd、真の終わりが訪れたことを決して検知することはできません。

証拠:

                        sw.Write(request);
                        sw.Flush();
                        var l = sr.ReadLine();

lリクエストの最初の行が入力されています。

ヘッダーを削除し、keep-alive次を追加します。

Connection: close

または、応答Content-Lengthヘッダーを使用して正しく読み取ります (バイナリ)。

于 2012-08-25T12:32:30.177 に答える
1
    A simple example is this:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Web;
    using System.Data;
    using System.Collections;
    using System.Collections.Specialized;
    using System.Windows.Forms;

    //Some "using" may not be needed
    static public TcpListener listener = new TcpListener(IPAddress.Any, 8080);

     static void Main(string[] args)
            {
             listener.Start();
             TcpClient client = listener.AcceptTcpClient();
             StreamReader sr = new StreamReader(client.GetStream());
             sr.ReadLine();
            }



**For asynchronous Connection:**


 static void Main(string[] args)
     {
       client_listener();
     }
async static public void client_listener()
        {
            while (true)
            {
                listener.Start();
                TcpClient client = await listener.AcceptTcpClientAsync();
                StreamReader sr = new StreamReader(client.GetStream());
                try
                {
                    await sr.ReadLineAsync();
                }
                catch(Exception e)
                {
                }
        }
}
于 2016-04-27T14:24:40.993 に答える