C# 流读取器读线工作不正常

C# 流读取器读线工作不正常,c#,sockets,networking,network-programming,C#,Sockets,Networking,Network Programming,对,我的StreamReader和StreamWriter有一个问题,从网络的角度来看,我有一个网络服务器和一个在它们之间来回发送消息的客户机,这在我实现HTTP 0.9协议之前一直工作得很好,但我正试图通过使用-h9作为检测协议来改变位置,问题就在这里 当我发送一个正常的名称和位置时,例如Hello Everyone,我的StreamReader和writer通过服务器正确发送和接收,但是如果我使用我的协议-h9 Hello Everyone并更改为Put/Hello Everyone,这就成

对,我的StreamReader和StreamWriter有一个问题,从网络的角度来看,我有一个网络服务器和一个在它们之间来回发送消息的客户机,这在我实现HTTP 0.9协议之前一直工作得很好,但我正试图通过使用-h9作为检测协议来改变位置,问题就在这里

当我发送一个正常的名称和位置时,例如Hello Everyone,我的StreamReader和writer通过服务器正确发送和接收,但是如果我使用我的协议-h9 Hello Everyone并更改为Put/Hello Everyone,这就成了一个问题。下面是代码

case "-h9":// http/0.9 protocol
                            if (args.Length == 3)
                            {
                                whatIsSent = "PUT /" + args[1] + "\r\n\r\n" + args[2] ;
                            }
                            else
                            {
                                arguments = arguments.Remove(0, 4);
                                whatIsSent = "GET /" + arguments;
                            }
                            break;
if (whatIsSent == null)
                {
                    sw.WriteLine(arguments);
                }
                else
                {
                    sw.WriteLine(whatIsSent);
                }
                sw.Flush();
下面是我服务器上的代码

data = sr.ReadLine();
                Console.WriteLine(string.Format("Received: {0}", data));
                //string data2 = sr.ReadLine();//not reading all for PUT/
                //string data3 = sr.ReadLine();
                //string Complete = data + data2 + data3;




                #region http0.9
                if (data.Contains("GET /") || data.Contains("PUT /"))
                {
                    protocol = data.Substring(0, data.IndexOf(" "));
                    data = data.Substring(1 + (protocol.Length + 1));
                    switch (protocol)
                    {
                        case "GET"://wont work cause of PUT
                            {
                                firstArg = data.Substring(0, data.Length);
                                secondArg = null;
                                useDictionary(firstArg, secondArg, ref returnData);
                                returnData = "HTTP/0.9 200 OK\r\nContent-Type: text/plain\r\n\r\n" + returnData;
                            }

                            break;
                        case "PUT"://wont work cause of PUT
                            if (data.Contains(" "))
                            {
                                firstArg = data.Substring(0, data.IndexOf(" "));
                                secondArg = data.Substring(data.IndexOf(" ") + 1, data.Length - firstArg.Length - 1);
                                useDictionary(firstArg, secondArg, ref returnData);
                            }
                            break;
如您所见,我通过data=sr.readline读入;但问题是,它似乎在接收PUT时将其拆分,而不是将其作为PUT/hello Everyone发送,它作为PUT/hello发送,并忽略了“Everyone”

所以我走了过去,我发现这是因为它将Put/Hello作为一行发送,然后每个人作为最后一行发送,所以我的数据只在开始时读取,所以我想为什么不使用readtoend,但这会使我的服务器停止工作,这是因为它到达readtoend时停止并且不移动

有人能帮忙吗。谢谢

这条线

whatIsSent = "PUT /" + args[1] + "\r\n\r\n" + args[2] ;
发送第二个参数、两个CRLF和第三个参数。ReadLine一直读到第一个换行符,所以对我来说这似乎是预期的行为

ReadToEnd读取,直到没有更多数据可读取为止,例如,在连接关闭后。由于客户端连接等待响应,因此不会发生这种情况

我不知道HTTP/0.9协议;但是HTTP/1.0用两个CRLF终止headers部分,如果请求头之外有请求数据,则发送一个内容长度头,它告诉您要读取多少字节


如果是完整的HTTP/0.9规范,那么它似乎不支持请求数据

您有两种解决方案,要么不使用StreamReader,而是直接使用NetworkStream之类的工具,要么继续读取行,直到没有新数据为止。