我是运行MPD(音乐播放器守护程序)的服务器,它通过套接字进行通信。现在我试图在Windows商店应用程序中实现MPD协议。基本上我发送一个命令并收到一个列表,其中包含最后一行" OK"。只要接收列表小于接收缓冲区,一切都可以。但是如果我需要加载大于缓冲区的数据,那么有线的东西就会开始。
第一次仅收到部分数据时调用SendCommand
,第二次调用SendCommand
时会收到其余数据。再次调用时,我会按预期接收所有数据。在同一台机器上的WPF程序中执行此操作时,一切都很好。
这是我的代码:
public async Task<string> SendCommand(MpdProtocol.MpdCommand command)
{
DataWriter writer = new DataWriter(streamSocket.OutputStream);
string res = string.Empty;
writer.WriteString(command.ToString());
await writer.StoreAsync();
res = await ReadResponse();
writer.DetachBuffer();
writer.DetachStream();
return res;
}
private async Task<string> ReadResponse()
{
DataReader reader = new DataReader(streamSocket.InputStream);
reader.InputStreamOptions = InputStreamOptions.Partial;
StringBuilder response = new StringBuilder();
const uint MAX_BUFFER = 8 * 1024;
uint returnBuffer = 0;
do
{
returnBuffer = await reader.LoadAsync(MAX_BUFFER);
response.Append(reader.ReadString(reader.UnconsumedBufferLength));
} while (returnBuffer >= MAX_BUFFER);
reader.DetachBuffer();
reader.DetachStream();
return response.ToString();
}
我使用了ReadResponse
方法,但没有任何效果。
有人能指出我正确的方向吗?
答案 0 :(得分:1)
最后,我找到了一个解决方案来使通信工作:用reader.ReadByte()
逐字节读取流并检查每个接收到的行(它们由"\n"
分隔)是否为& #34; OK&#34 ;.
问题是reader.ReadString
。当你知道字符串是多久你会尝试接收时,这种方法很好。在我的情况下,我不知道字符串的大小。我所知道的是,最后一行将是&#34; OK&#34;串。
我的错误是相信 - 正如彼得提到的那样 - 只要有数据来反转recive缓冲区将被完全填充,只有最后一次调用reader.ReadString
将小于最大缓冲区大小。我还试图以不同的方式重写ReadResponse
函数,但对reader.ReadString
没有任何效果。