C# 流读取器读线工作不正常
对,我的StreamReader和StreamWriter有一个问题,从网络的角度来看,我有一个网络服务器和一个在它们之间来回发送消息的客户机,这在我实现HTTP 0.9协议之前一直工作得很好,但我正试图通过使用-h9作为检测协议来改变位置,问题就在这里 当我发送一个正常的名称和位置时,例如Hello Everyone,我的StreamReader和writer通过服务器正确发送和接收,但是如果我使用我的协议-h9 Hello Everyone并更改为Put/Hello Everyone,这就成了一个问题。下面是代码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,这就成
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之类的工具,要么继续读取行,直到没有新数据为止。