流阅读器readline无法正常工作

时间:2014-03-04 20:24:33

标签: c# sockets networking network-programming

从网络角度来看,我的StreamReaderStreamWriter存在问题,我有一个网络服务器和一个在它们之间来回发送消息的客户端,这一直很好用到我实现了HTTP 0.9协议,但是我试图通过使用-h9作为检测协议来改变位置,所以这就是问题所在。

当我发送一个正常的名称和位置,例如Hello everybody我的StreamReader和作者通过服务器正确发送和接收,但如果我使用我的协议“-h9 hello everybody”并更改为{ {1}}这就成了一个问题。以下是代码。

Put /hello everybody

下面是我服务器的代码。

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; 了解了问题,但问题是它似乎在接收PUT时将其拆分而不是data = sr.readline();它是Put /hello everybody

所以我介入了,我发现这是因为它将Put /Hello" and misses the "everybody作为一行发送,而“”作为另一行发送Put /Hello作为最后一行,所以我的数据只在开头读取,所以我以为为什么不使用readtoend,但这会阻止我的服务器工作,这是因为它来到readtoend,只是暂停,并没有移动。

任何人都可以提供帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

这一行

whatIsSent = "PUT /" + args[1] + "\r\n\r\n" + args[2] ;

发送第二个参数,两个CRLF和第三个参数。 ReadLine()读取直到第一个换行符,这对我来说似乎是预期的行为。

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

我不知道HTTP / 0.9协议;但HTTP / 1.0会终止带有两个CRLF的headers部分,如果请求头之外还有请求数据,则会发送Content-Length头,这会告诉您要读取多少字节。

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