HTTPを使用してリクエストを分析するために、C#でいくつかのmp3ストリームにTCP接続を作成しています。 は、私は、接続を開くと、私はいつもほとんどの場合、TCPClientは400を返す
tcpClient.GetStream().Close();
tcpClient.Close();
を使用して、それを閉じて、私も使用してみました:
client.Client.Disconnect(false);
私は再び私のアプリを実行し、再接続した場合、私は400(不正な要求)を受信します私が接続がもはや存在しない "netstat"を使用しているのを見ても、応答ヘッダーで接続を閉じる。 これは私がこれまで持っているコードです:もちろん
string headers = new string [] {
"GET /stream HTTP/1.0",
"Host: sci.streamingmurah.com:8032",
"Connection: keep-alive",
"Accept-Encoding: identity;q=1, *;q=0",
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
"Accept: */*",
"Referer: 82.XX.XX.XX",
"Accept-Language: en-US,en;q=0.8,he;q=0.6"
};
try
{
using (TcpClient client = new TcpClient())
{
client.SendTimeout = 5000;
client.ReceiveTimeout = 5000;
client.Connect(host, port);
using (NetworkStream ns = client.GetStream())
{
foreach (string requestHeader in headers)
{
Debug.WriteLine("Request Header: " + requestHeader);
byte[] headerBytes = Encoding.ASCII.GetBytes(requestHeader);
ns.Write(headerBytes, 0, headerBytes.Length);
ns.WriteByte(13);
ns.WriteByte(10);
}
ns.WriteByte(13);
ns.WriteByte(10);
List<string> responseHeaders = new List<string>();
string responseHeader;
while (Utils.ReadLine(ns, Encoding.ASCII, out responseHeader) && responseHeader.Length > 0)
{
responseHeaders.Add(responseHeader);
}
//Response headers contains
if (responseHeaders.Count == 0)
{
traceInfo.AddLine(TraceInfo.EntryKind.Alert, "Response is empty");
client.GetStream().Close();
client.Close();
//client.Client.Disconnect(false);
return null;
}
Playable pl = HandleResponse(responseHeaders.ToArray(), ns);
client.GetStream().Close();
client.Close();
return pl;
}
}
}
catch (Exception e)
{
traceInfo.AddLine(TraceInfo.EntryKind.Alert, String.Format("Exception: {0}", e.Message));
}
return null;
- 私はChromeでストリームを実行する場合、それは常に動作します。私がやっていることは間違っているはずです。
おかげ
おそらく 'Content-Length'がないためです。 (WebClientやHttpClientを使うのはなぜですか?) –
@ L.B:これはGETリクエストです。それはコンテンツを持たないので、Content-Lengthヘッダーは使用されません(ブラウザーはこれをしません)。 –