使用Socket获取HTTP时的额外字符

时间:2013-11-13 11:21:19

标签: c# sockets http

我正在使用套接字连接到各种XML Web服务。但是当我将收到的字节转换为字符串(通常是UTF-8编码)时,我会得到一些额外的字符串。大多数情况下,返回的字符串以“4000 \ r \ n”开头,然后“\ r \ n \ n4000 \ r \ n”散布在数据中。其他时候字符串可以是“\ r \ nd1ef \ r \ n”或4-8个十六进制“字母”的其他组合。有时它是一次性的。我注意到的一些东西:

  • 如果开头没有“xxxx \ r \ n”,则字符串是干净的
  • 如果我多次调用相同的网址,我总会得到相同的结果(在相同位置使用相同的额外字符串)
  • 字符串通常是4个十六进制字符,其周围带有“\ r \ n”,但它也可以是8个十六进制字符
  • 它发生在许多不同的Web服务上,所以它可能不在服务器端
  • 因为它始终以“\ r \ n”开头和结尾,所以它不能是随机的额外字节数据

我猜这是某种HTTP“分页”特征或者我不知道的东西。

这是我的代码:

var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.ReceiveTimeout = timeout;
client.SendTimeout = timeout;
client.NoDelay = true;
client.Connect(server, port);

//send HTTP request
client.Send(totalData, totalData.Length, SocketFlags.None);

//read the data
var buffer = new byte[32];
byteStream = new MemoryStream();

while (true)
{
    var readCount = client.Receive(buffer, buffer.Length, SocketFlags.None);

    if (readCount > 0)
    {
        byteStream.Write(buffer, 0, readCount);
    }
    else
        break;
}

client.Disconnect(false);
client.Close();

//get the HTTP response
var bytes = byteStream.ToArray();

var ascii = Encoding.ASCII.GetString(bytes.ToArray());

var bodyPosition = ascii.IndexOf("\r\n\r\n") + 4;

var bodyBytes = new byte[bytes.Length - bodyPosition];
Array.Copy(bytes,bodyPosition,bodyBytes,0,bodyBytes.Length);

var body = dataEncoding.GetString(bodyBytes);

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:3)

这是分块传输编码。使用HTTP库。