使用C#编写“原始”的HTTP客户端

4

我正在尝试用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模式连接时,同样会发生这种情况。


你的代码很好用啊...我把你的代码复制粘贴到一个新的控制台应用程序里,它完美地运行了。也许你遇到了其他问题(比如网络或其他什么)。 - Timothy Khouri
谢谢Timothy。我想我的问题是我在代理服务器后面。我会自己再测试一下... - Ries
剪切和粘贴对我来说很方便。 - divinci
3个回答

3

如果你在测试这个东西,最好安装本地的IIS或Apache,然后使用地址127.0.0.1;这样可以更全面地测试不同的内容!

作为一个有点保守的人,我不希望有人使用我的网站来测试他们对HTTP协议的实现。


到这个时候...谷歌可能会说..."用户代理:CSharp?...我想不是!"(我不认为这就是问题所在,但关键是,在受控环境中进行测试,以便您知道问题是您的代码。) - Timothy Khouri
当然,事实上,我是在对自己的服务器进行测试,但不想在这里公布地址。很抱歉谷歌,我使用了你们的地址 :| - Ries

2
如果您要在“原始”级别下进行操作,那么您需要了解那里的协议。请参考超文本传输协议--HTTP/1.1
否则,您应该只使用WebRequest和WebClient类。

同意 - 仅通过试错方式尝试建立连接,你无法了解协议的更多细节。编写HTTP客户端是一项严肃的任务。 - Greg Beech
他的观点是从代码角度理解它,以便在另一种语言中编写代码...在这种情况下,使用.NET特定类并不有帮助。 - Timothy Khouri
那么他最好阅读并理解那个RFC以及它所基于的其他RFC。他能说出HTTP协议基于哪个协议吗?(现在不要帮助学生) - John Saunders
1
就像Timothy所说的,最终我会使用Java,所以尝试使用.NET特定的类是没有用的。无论如何,谁说我没有阅读RFC呢? - Ries
我没有看到它的证据。也许这是风格上的差异,但我会明确地使用行尾字符。告诉我HTTP协议基于什么,我就不再谈论它了。 - John Saunders

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

希望这能有所帮助。


1
他正在建立一个外部连接,而不是监听传入的连接。 - Greg Beech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接