【问题标题】:C# Server will not read in multiple lines sent from the clientC#服务器不会读取客户端发送的多行
【发布时间】:2017-02-20 15:07:40
【问题描述】:

我目前正在创建一个与服务器通信的客户端。到目前为止,任何通信都不会超过一条线,所以我已经能够使用 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);

所以,为了帮助澄清问题,如果我将如上所示的命令发送到服务器,服务器的响应将是“收到的响应:GET”+“/?name=”+args[0]+“ HTTP/1.1" 而不是其他行。

任何帮助将不胜感激!

谢谢

露西

【问题讨论】:

  • 有什么东西关闭了连接吗?如果没有,您预计ReadToEnd 何时返回?
  • 从哪里调用你的 readtoend?它怎么知道什么时候开火?
  • 另外,你好像在写一个HTTP客户端,你不能改用内置的HttpClient吗?
  • 我删除了 readtoend 因为它导致连接失败
  • @DavidG 我不知道你能做到,我去看看

标签: c# server client streamreader readline


【解决方案1】:

ReadToEnd() 可能会无限期阻塞像 NetworkStream 这样的非关闭流。我猜你得到的错误是超时或类似的东西?

读取标题的最简单方法是多次调用ReadLine()。如果它返回 null ,则表示流结束(客户端已断开连接,可能是错误情况,除非指定了 Connection: Closed 并且您已读取空行)。空行表示您已到达标题的末尾。之后是可选的请求正文,由可选的Content-Length 标头指定。

请记住,StreamReader 缓冲数据!如果内容主体不是 ASCII 文本,这一点很重要。

一般来说,我不认为你应该自己实现 HTTP 阅读,但这是一个有趣的学习经验,成为一个重要的标准。

【讨论】:

    【解决方案2】:

    你能试试我从link得到的以下代码吗?

                using (StreamReader sr = new StreamReader(path)) 
                {
                    while (sr.Peek() >= 0) 
                    {
                        Console.WriteLine(sr.ReadLine());
                    }
                }
    

    【讨论】:

      【解决方案3】:

      你可以读取所有数据

       using (StreamReader sr = new StreamReader(filePath))
        {
          string line;
             while ((line = sr.ReadLine()) != null)
              {
                  Console.WriteLine(line);
                  //Or do your work here.
              }
        }
      

      【讨论】:

      • 虽然你的答案足够好,但你可以添加一些上下文来帮助提问者理解你的代码吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多