使用Data Writer Stream Sockets,Windows phone 8显示完整的响应流

时间:2013-02-13 13:52:57

标签: windows-phone-8

我正在客户端使用Windows Phone 8的winRT流套接字。我的代码是

  var streamScoket = new StreamSocket();
        await streamScoket.ConnectAsync(new HostName(txtServer.Text), portNumber.ToString(), SocketProtectionLevel.PlainSocket);

        DataWriter dw = new DataWriter(streamScoket.OutputStream);

        dw.WriteString("Hello");

        await dw.StoreAsync();

        DataReader reader = new DataReader(streamScoket.InputStream);

        reader.InputStreamOptions = InputStreamOptions.Partial;

        await reader.LoadAsync(4);

        string data = string.Empty;

        while (reader.UnconsumedBufferLength > 0)
        {
            data += reader.ReadString(reader.UnconsumedBufferLength);
        }

        txtConnections.Text = data;
        }

在服务器端,当我通过"您好"时,我发送的回复是#34;好的,您正在收到来自服务器的消息"这个文本。但在我的" txtconnections"仅限文本框"好"文字显示,因为我知道我已通过" 4" in" LoadAsync"。如果我增加" 4"为了更有价值,我可以显示所有内容。但是,当Tcp在数据流上运行时,我们如何知道响应流的结束,或者如果我们有" 4"我们将如何继续循环?在" loadasync"。有人可以帮助我找到解决方案并简要解释一下..在这里" UnconsumedBufferLength"包含" 4"从下一个开始,它是" 0" ...

2 个答案:

答案 0 :(得分:2)

一旦你有一个StreamSocket开放式通信默认是非结构化的。意思是,您发送和接收字节流,并且您作为开发人员需要了解它们。如果你想传输一个随机长度的字符串,那就去吧,但是你必须构建蓝牙StreamSocket以期望它们。这样的结构可能看起来像 | 1字节,用信号发送版本号| 1字节来表示自由文本传输开始| 4字节以字节为单位传输字符串大小的int32 |以字节为单位的自由文本以指定长度| 4字节为单位字符串MD5 / SHA1哈希验证文件的内容| 。这真的取决于你的协议是什么样的,但请记住你必须发送和接收字节。

诺基亚{{}}启动了NFC分享和分享,打开了StreamSocket并通过该套接字传输结构化消息。它将向您展示如何使用NFC,升级到WiFi /蓝牙并使用真实版本的结构化消息格式。查看诺基亚的NFC Talk项目an end-to-end samplehere

答案 1 :(得分:1)

由于TCP在数据流上运行,因此数据流本身必须告诉您响应何时完成。这通常使用长度前缀或分隔符来完成。 I have a blog post describing these different approaches.

DataReader不是TCP的一部分;它是一个通用的流阅读器和解释器。实际上只有BitConverter有一个(更好)的API。它只会从流中读取,但是你会告诉它很多字节。你的代码有LoadAsync从流中加载四个字节进入阅读器,但从来没有,所以你得到一个四字节的字符串而不是别的。

如果可以,请更改协议以使用长度前缀。然后,使用DataReader首先读取长度,然后阅读消息非​​常简单。如果无法更改协议,或者您使用分隔符,那么您需要读入partial chunks of data,直到您可以检测到消息的结束,然后保存所有剩余的数据以继续下一条消息的开头。