从网络角度来看,我的StreamReader
和StreamWriter
存在问题,我有一个网络服务器和一个在它们之间来回发送消息的客户端,这一直很好用到我实现了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,只是暂停,并没有移动。
任何人都可以提供帮助。谢谢。
答案 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规范,那么它似乎不支持请求数据)