gpt4 book ai didi

c# - WinRT 上的 StreamSocket 不接收所有数据

转载 作者:行者123 更新时间:2023-11-30 17:44:46 25 4
gpt4 key购买 nike

我有一台运行 MPD(音乐播放器守护程序)的服务器,它通过套接字进行通信。现在我正在尝试在 Windows 商店应用程序中实现 MPD 协议(protocol)。基本上我发送一个命令并收到一个列表,该列表的最后一行是“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 方法,但没有任何效果。

有人能指出我正确的方向吗?

最佳答案

最后,我找到了使通信正常工作的解决方案:使用 reader.ReadByte() 逐字节读取流并检查每个接收到的行(它们由 分隔)\n") 表示“正常”。

问题是reader.ReadString。当您知道要尝试接收的字符串有多长时,此方法非常有用。就我而言,我不知道字符串的大小。我所知道的是最后一行将是一个“OK”字符串。

我的错误是相信 - 正如 Peter 提到的 - 只要有数据可以检索,接收缓冲区就会被完全填满,只有最后一次调用 reader.ReadString 会小于最大缓冲区大小。我还尝试以不同的方式重写 ReadResponse 函数,但对 reader.ReadString 没有任何作用。

关于c# - WinRT 上的 StreamSocket 不接收所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29020817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com