我目前正在创建一个与服务器通信的客户端。到目前为止,任何通信都不会超过一行,所以我已经能够使用Streamreader readline来获取客户端输入。 但是,我现在拥有多行代码的命令,但是服务器只会读取第一行,因为我使用了readline()。 我尝试过readtoend(),但是当我这样做时,服务器和客户端之间的连接由于某种原因而失败。
以下是我客户端中的代码,该示例显示了一个由多行发送的命令:
else if (args.Length == 1)
{
sw.WriteLine("GET" + " /?name=" + args[0] + " HTTP/1.1");
sw.WriteLine("HOST: " + host);
sw.WriteLine("");
sw.Flush();
}
这是我服务器中的代码,它在行中读取:
string line = sr.ReadToEnd().Trim();
Console.WriteLine("Respond Recieved " + line);
String[] Sections = line.Split(new char[] { ' ' }, 2);
因此,为了帮助澄清问题,如果我将如上所示的命令发送到服务器,来自服务器的响应将是“Response Received:GET”+“/?name =”+ args [0] +“ HTTP / 1.1“而不是其他行。
非常感谢任何帮助!
谢谢
露
答案 0 :(得分:1)
ReadToEnd()
可能无限期地阻塞非关闭流,如NetworkStream。我猜你得到的错误是超时或类似的东西?
阅读标题的最简单方法是多次调用ReadLine()
。如果它返回null,表示流结束(客户端断开连接,可能是错误条件,除非指定了Connection:Closed并且您已读取空行)。空行表示您已到达标题的末尾。之后是可选的请求主体,它将由可选的Content-Length
标头指定。
请记住StreamReader
缓冲数据!如果内容正文不是ASCII文本,那么这很重要。
一般来说,我认为你不应该自己实施HTTP阅读,但这是一个有趣的学习经验,是一个重要的标准。
答案 1 :(得分:0)
您可以尝试我从此link获得的以下代码吗?
using (StreamReader sr = new StreamReader(path))
{
while (sr.Peek() >= 0)
{
Console.WriteLine(sr.ReadLine());
}
}
答案 2 :(得分:0)
您可以阅读所有数据
using (StreamReader sr = new StreamReader(filePath))
{
string line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
//Or do your work here.
}
}