Writing a “raw” HTTP client in C#

2019-05-06 17:01发布

问题:

I am trying to write a "raw" HTTP client in C#. You may ask why??

My aim is to implement an HTTP client in J2ME (which can only do GET and limited POST), but first I need to understand the HTTP protocol better (hence the C# attempt).

My first attempts are failing:

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

The socket opens, but then blocks at the Receive call. After a couple of seconds the remote host closes the connection.

Any ideas?

The same happens when I try to connect using the RAW mode in puTTY.

回答1:

It might be best if you're testing this thing, to install IIS or Apache locally and then use the address 127.0.0.1; it gives you more scope to test different things!

Being a bit of a prude, I wouldn't like it if somebody used my website to test their implementation of the HTTP protocol.



回答2:

If you're going to be playing down at the "raw" level, then you're responsible for understanding the protocols down there. See Hypertext Transfer Protocol -- HTTP/1.1 .

Otherwise, you should just stick to the WebRequest and WebClient classes.



回答3:

I think you need to use TcpListener class.

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

Then

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

Hope it will help.



标签: c# http sockets