我用C#写了一些代码
string host = new Uri(_url).Host;
IPHostEntry ipAddress = Dns.GetHostEntry(host);
IPEndPoint ip = new IPEndPoint(ipAddress.AddressList[0], 80);
using (Socket s = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
{
s.Connect(ip);
using (NetworkStream n = new NetworkStream(s))
{
byte[] write = encoding.GetBytes(HttpQuery);
n.Write(write, 0, write.Length);
ReadLine(n);
Dictionary<string, string> headers = new Dictionary<string, string>();
while (true)
{
string line = ReadLine(n);
if (line.Length == 0)
{
break;
}
int index = line.IndexOf(':');
if (!headers.ContainsKey(line.Substring(0, index)))
{
headers.Add(line.Substring(0, index), line.Substring(index + 2));
}
}
string contentEncoding;
if (headers.TryGetValue("Content-Encoding", out contentEncoding))
{
Stream responseStream = n;
if (contentEncoding.Equals("gzip"))
{
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
responseStream.Flush();
}
else if (contentEncoding.Equals("deflate"))
{
responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
}
MemoryStream memStream = new MemoryStream();
byte[] respBuffer = new byte[4096];
try
{
int bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);
//int bytesRead = responseStream.ReadByte();
while (bytesRead > 0)
{
memStream.Write(respBuffer, 0, bytesRead);
bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);
}
}
finally
{
responseStream.Close();
}
string str = encoding.GetString(memStream.ToArray());然后在这一行中有一个异常InvalidDataException:int bytesRead = responseStream.Read(respBuffer,0,respBuffer.Length);
GZip头幻数不正确。
string ReadLine(Stream stream)
{
List<byte> lineBuffer = new List<byte>();
try
{
while (true)
{
int b = stream.ReadByte();
if (b == -1)
return null;
if (b == 10)
break;
if (b != 13)
lineBuffer.Add((byte) b);
}
}
catch (Exception)
{
}
return encoding.GetString(lineBuffer.ToArray());
}有什么想法吗?
发布于 2010-02-06 15:48:02
当读取空行时,您的ReadLine函数一读取一行提要字符就会返回。这是否可能使流定位于回车字符,而不是位于GZip数据流的开头?
发布于 2010-02-06 16:15:09
一般来说,我在这个主题上找到了一些东西,这里是Sockets in C#: How to get the response stream?链接,在字符串之前有一些信息可以这样做:
Stream responseStream = n;
int magicNumber = 0;
while (magicNumber != 10)
{
magicNumber = responseStream.ReadByte();
}
if (contentEncoding.Equals("gzip"))
{
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
}也许我做得不太正确?
nobugz我用WttWebRequest和HttpWebResponse编写了非常简洁的代码,但是我的页面有代码页- 1251,HttpWebRequest将url从1251编码转换为utf-8i,这与此无关,也许您有什么想法吗?
例如,我使用url作为
HttpWebRequest将此转换为 (UTF-8)
但是将会是(windows-1251),我不知道如何解决这个问题
https://stackoverflow.com/questions/2212897
复制相似问题