我正在编写一个TCP客户端和一个使用手动编写的HTTP请求进行通信的服务器。我遇到的麻烦是使用StreamReader
从Network Stream
读取。到目前为止,我尝试了很多方法,但无济于事。C# - 使用StreamReader读取HTTP请求
我从TCP客户端获得的请求有多种形式。为了更新数据库,则请求是这样的(CRLF是一个常数我使用表示"\r\n"
字符串):
HTTP 1.0:
“POST /” +名称+“HTTP/1.0 “+ CRLF +”Content-Length:“+ length + CRLF + CRLF + location;
HTTP 1.1:
“POST/HTTP/1.1” + CRLF +主机名+ “内容长度:” +长度+ CRLF + CRLF + nameLocString;
的请求是正确的形式,并在客户端正确发送它们 - 我已经测试这一个服务器上,我有机会在答复他们没有问题。
我的问题是我的TCP侦听器代码。为了避免发布整个代码,我只包含有问题的代码部分(通过调试发现)。
Server代码:
NetworkStream socketStream = new NetworkStream(connection);
StreamReader sr = new StreamReader(socketStream);
string input = ReadAllLinesWithNull(sr); // reading version 1
string input = ReadAllLinesWithEndOfStream(sr); // reading version 2
string input = ReadAllLinesWithPeek(sr); // reading version 3
string input = sr.ReadToEnd(); // reading version 4
和使用的方法是:
static string ReadAllLinesWithNull(StreamReader sr)
{
string input;
string nextLine;
input = sr.ReadLine();
while ((nextLine = sr.ReadLine()) != null)
{
Console.WriteLine(input);
input += nextLine;
}
sr.Close();
return input;
}
static string ReadAllLinesWithEndOfStream(StreamReader sr)
{
string input = "";
while (!sr.EndOfStream)
{
input += sr.ReadLine();
}
sr.Close();
return input;
}
static string ReadAllLinesWithPeek(StreamReader sr)
{
string input = "";
while (sr.Peek() >= 0)
{
input += sr.ReadLine();
}
sr.Close();
return input;
}
这些方法用于读取无工作。随着连接超时设置,我一直在获得IO异常,它需要太长的时间来读/连接被强制关闭。我关掉了超时时间,而且Read的时间不确定。
由于使用ReadLine()
的I能挑出它最终挂起发现,当两个CRLFs("\r\n\r\n"
)的集群协议和的所有版本的地方,流Reader是无法应付与此并卡住。
对于如何解决这个问题你有什么建议吗?我需要按照规范使用具有多个CRLF的版本。
如果您需要任何附加信息,我会尽量以sson的形式提供。
您可以发布“无法应对此问题并卡住”的代码,因为您发布的内容对我来说工作正常。请注意,'ReadLine' [不包含任何终止退货或换行](https://msdn.microsoft.com/en-us/library/system.io.streamreader.readline%28v=vs.110%29.aspx) ,所以你发布的内容将返回所有与退货和换行连接在一起的内容。 –
@DourHighArch我提供的代码是代码,它对我来说都是失败的。我检查了并且客户端正确将提到的HTTP请求写入流并刷新它们,然后当我使用任何ReadLine方法读取时,我从来没有得到超过Content-Length:+ length + CRLF + CRLF的任何内容。它会无限期地读取或在设置超时时抛出异常。感谢关于ReadLine的说明。我首先想要尽可能简单地阅读,然后看看正确的阅读。我用新的简单服务器测试了阅读(只读和回显),它也有同样的问题。 –