我使用Socket
类我的网络客户端接收HTTP消息。我不能使用HttpWebRequest
,因为它不支持袜子代理。所以我必须解析头文件并自己处理分块编码。对我来说最困难的是确定内容的长度,所以我必须逐字节读取它。首先,我必须使用ReadByte()
来查找最后一个标题(“\ r \ n \ r \ n”组合),然后检查主体是否具有传输编码。如果是这样我要读块的大小等:如何采用Socket
public void ParseHeaders(Stream stream)
{
while (true)
{
var lineBuffer = new List<byte>();
while (true)
{
int b = stream.ReadByte();
if (b == -1) return;
if (b == 10) break;
if (b != 13) lineBuffer.Add((byte)b);
}
string line = Encoding.ASCII.GetString(lineBuffer.ToArray());
if (line.Length == 0) break;
int pos = line.IndexOf(": ");
if (pos == -1) throw new VkException("Incorrect header format");
string key = line.Substring(0, pos);
string value = line.Substring(pos + 2);
Headers[key] = value;
}
}
但这种方法有非常差的性能。你能提出更好的解决方案吗也许一些开源的例子或者通过套接字处理http请求的库(虽然不是很大但复杂,我是一个noob)。 最好将后连结例如,读取消息主体和正确处理情况下,当:内容已分块编码,是gzip-或放气编码,省略Content-Length头(当连接关闭消息结束时)。类似于HttpWebRequest类的源代码。
UPD: 我的新功能如下:
int bytesRead = 0;
byte[] buffer = new byte[0x8000];
do
{
try
{
bytesRead = this.socket.Receive(buffer);
if (bytesRead <= 0) break;
else
{
this.m_responseData.Write(buffer, 0, bytesRead);
if (this.m_inHeaders == null) this.GetHeaders();
}
}
catch (Exception exception)
{
throw new Exception("Read response failed", exception);
}
}
while ((this.m_inHeaders == null) || !this.isResponseBodyComplete());
凡GetHeaders()
和isResponseBodyComplete()
使用m_responseData
(MemoryStream
)与已接收到的数据。
如果您只是继续编辑此问题,与你觉得麻烦的东西,我会添加更多简单的答案,我原来的答案。 – 2010-06-08 17:11:50
你不能使用WinInet吗? http://msdn.microsoft.com/en-us/library/aa383996(VS.85).aspx – 2010-06-09 23:10:56
相关,可能重复:http://stackoverflow.com/questions/11862890/c-how-to-execute- a-http-request-using-sockets – vapcguy 2017-05-11 20:16:28