2011-11-01 73 views
2

早上好 我C#程序员,我有一个问题CONNECT HTTP方法

我试图打开插座得到一个HTTP连接,并读取网页的字节 流和所有是正确的, 例如,通过一个C#的Socket得到谷歌的主页, 我遵循的步骤是:

1.Opening流,并连接到Google服务器:

Socket skt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
skt.Connect("www.google.com", 80); 

2.preparing请求,并把它以字节数组:

string hdrs = "GET/HTTP/1.1\r\n" 
    + "Host: www.google.com\r\n\r\n"; 
byte[] req_as_bytes = Encoding.UTF8.GetBytes(hdrs); 

3.Sending HTTP请求:

skt.Send(req_as_bytes); 

4.Receiving响应:

byte[] data = new byte[1024 * 200]; // 200 kilo bytes 
int t = skt.Receive(data); 
Console.WriteLine(Encoding.UTF8.GetString(data,0,t)); 

但是当我改变http方法从[GET]到[CONNECT], 的回应将是空的!

string hdrs = "CONNECT www.google.com:443 HTTP/1.1\r\n" 
    + "Host: www.google.com:443\r\n" 
    + "Proxy-Connection: keep-alive\r\n\r\n"; 

任何一个可以帮助我:或无数据从服务器 新的请求被接收?

的完整代码:

static void Main(string[] args) 
{ 
    Socket skt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    skt.Connect("www.google.com", 443); 
    string hdrs = "CONNECT www.google.com:443 HTTP/1.1\r\n" 
     + "Host: www.google.com:443\r\n" 
     + "Proxy-Connection: keep-alive\r\n\r\n"; 
    byte[] req_as_bytes = Encoding.UTF8.GetBytes(hdrs); 
    skt.Send(req_as_bytes); 
    byte[] data = new byte[1024 * 200]; // 200 kilo bytes 
    int t = skt.Receive(data); 
    Trace.WriteLine(Encoding.UTF8.GetString(data, 0, t); 
    skt.Shutdown(SocketShutdown.Both); 
    skt.Close(); 
} 

谢谢... Mhamad

+0

你知道'CONNECT'的作用吗?你知道下一步该做什么或期待吗?当您尝试学习套接字时,HTTP并不是最容易学习的协议。 – CodeCaster

+0

你期望'CONNECT'会做什么?您为什么认为它适用于google.com? – svick

+0

它适用于任何网站支持https, – MhdAboAhmad

回答

2

如果你真的想实现一个HTTPS服务器,你需要阅读RFC

顺便说一句,它已经在.NET中实现:System.Net.HttpListener

+0

谢谢, ,但我仍然需要使用一个简单的套接字 – MhdAboAhmad

+4

'套接字'实现TCP是一种传输层协议。 HTTP/HTTPS是位于TCP之上的应用层协议。如果你想使用'Socket',你将不得不从RFC实现HTTP/HTTPS。这并不容易 - 祝你好运! –

0
socket.Connect("www.google.com", **80**); 

string hdrs = "CONNECT www.google.com:**443** HTTP/1.1\r\n" 
    + "Host: www.google.com:443\r\n" 
    + "Proxy-Connection: keep-alive\r\n\r\n"; 

80 - 443冲突!

如果您使用443端口?必须使用.NET 4.0 FRAMEWORK-SSLSTREAM类。