在C#中编写“原始”HTTP客户端

时间:2009-07-23 11:01:25

标签: c# http sockets

我正在尝试用C#编写一个“原始”HTTP客户端。你可能会问为什么?

我的目标是在J2ME中实现HTTP客户端(它只能执行GET和有限的POST),但首先我需要更好地理解HTTP协议(因此C#尝试)。

我的第一次尝试失败了:

var requestBytes = Encoding.UTF8.GetBytes(@"GET / HTTP/1.1
User-Agent: CSharp
Host: www.google.com

");
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("www.google.com", 80);
socket.Send(requestBytes);
var responseBytes = new byte[socket.ReceiveBufferSize];
socket.Receive(responseBytes);
Console.Out.Write(Encoding.UTF8.GetString(responseBytes));

套接字打开,但随后在接收呼叫时阻塞。几秒钟后,远程主机关闭连接。

有什么想法吗?

当我尝试使用puTTY中的RAW模式进行连接时,会发生同样的情况。

3 个答案:

答案 0 :(得分:3)

最好是在测试这个东西,在本地安装IIS或Apache,然后使用地址127.0.0.1;它为您提供了更多的空间来测试不同的东西!

如果有人使用我的网站来测试他们对HTTP协议的实现,我会不喜欢它。

答案 1 :(得分:1)

如果您打算在“原始”级别进行游戏,那么您有责任了解那里的协议。请参阅Hypertext Transfer Protocol -- HTTP/1.1

否则,您应该坚持使用WebRequest和WebClient类。

答案 2 :(得分:-5)

我认为你需要使用TcpListener类。

// Begin listening for incoming connection requests
TcpListener myListener = new TcpListener("localhost", 8080); // change to yours
myListener.Start();

然后

Socket mySocket = myListener.AcceptSocket();
if (mySocket.Connected)
{
   // do some work
   mySocket.Send(<data>, <length>, 0);
}

希望它会有所帮助。