Windows phone 8 使用数据写入器流套接字显示完整的响应流,Windows phone 8

Windows phone 8 使用数据写入器流套接字显示完整的响应流,Windows phone 8,windows-phone-8,Windows Phone 8,我正在客户端处理WindowsPhone8的winRT流套接字。我的代码是 var streamScoket = new StreamSocket(); await streamScoket.ConnectAsync(new HostName(txtServer.Text), portNumber.ToString(), SocketProtectionLevel.PlainSocket); DataWriter dw = new DataWriter(st

我正在客户端处理WindowsPhone8的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;
        }

在服务器端,当我传递“Hello”时,我正在发送一个文本的响应“很好,您正在接收来自服务器的消息”。但在我的“txtconnections”文本框中,只显示“Good”文本,因为我知道我在“LoadAsync”中通过了“4”。如果我将“4”增加到更多值,我可以显示所有内容。但由于Tcp在数据流上运行,我们如何知道响应流结束,或者如果“loadasync”中有“4”,我们如何继续循环。有人能帮我找到解决办法并给我简单解释一下吗。。这里“UnsumedBufferLength”包含“4”,从下一步开始为“0”…

由于TCP对数据流进行操作,因此数据流本身必须告诉您响应何时完成。这通常使用长度前缀或分隔符来完成

DataReader
不是TCP的一部分;它是一个通用的流读取器和解释器。它实际上只是
BitConverter
,具有(更好)的API。不管你告诉它多少字节,它只从流中读取。您的代码有
LoadAsync
将流中的四个字节加载到读卡器中,但再也不会加载了,因此获得一个四字节字符串而没有其他内容是非常有意义的


如果可以,请将协议更改为使用长度前缀。然后,使用
DataReader
首先读取长度,然后读取消息是非常简单的。如果无法更改协议,或者使用分隔符,则需要读入,直到可以检测到消息的结尾,然后保存通过的所有剩余数据,以继续下一条消息的开头。

由于TCP对数据流进行操作,数据流本身必须告诉您响应何时完成。这通常使用长度前缀或分隔符来完成

DataReader
不是TCP的一部分;它是一个通用的流读取器和解释器。它实际上只是
BitConverter
,具有(更好)的API。不管你告诉它多少字节,它只从流中读取。您的代码有
LoadAsync
将流中的四个字节加载到读卡器中,但再也不会加载了,因此获得一个四字节字符串而没有其他内容是非常有意义的


如果可以,请将协议更改为使用长度前缀。然后,使用
DataReader
首先读取长度,然后读取消息是非常简单的。如果无法更改协议,或者使用分隔符,则需要读入,直到可以检测到消息的结尾,然后保存通过的所有剩余数据,以继续下一条消息的开头。

一旦打开StreamSocket,默认情况下,通信是非结构化的。也就是说,您发送和接收字节流,作为开发人员,您需要理解它们。如果你想传输一个随机长度的字符串,就去做吧,但是你必须构造Bluetooth StreamSocket来预期这些。这种结构可能看起来像| 1字节表示版本号| 1字节表示自由文本传输开始| 4字节表示传输字符串大小的int32字节|自由文本表示指定长度的字节| 4字节表示字符串MD5/SHA1哈希以验证文件内容|。协议的外观实际上取决于您,但请记住,您必须发送和接收字节


诺基亚拥有启动NFC分接和共享、打开StreamSocket并通过该套接字传输结构化消息的功能。它将向您展示如何使用NFC、升级到WiFi/Bluetooth以及使用真实世界版本的结构化消息格式。查看诺基亚的NFC Talk项目,然后点击

一旦拥有StreamSocket,默认情况下,开放式通信是非结构化的。也就是说,您发送和接收字节流,作为开发人员,您需要理解它们。如果你想传输一个随机长度的字符串,就去做吧,但是你必须构造Bluetooth StreamSocket来预期这些。这种结构可能看起来像| 1字节表示版本号| 1字节表示自由文本传输开始| 4字节表示传输字符串大小的int32字节|自由文本表示指定长度的字节| 4字节表示字符串MD5/SHA1哈希以验证文件内容|。协议的外观实际上取决于您,但请记住,您必须发送和接收字节


诺基亚拥有启动NFC分接和共享、打开StreamSocket并通过该套接字传输结构化消息的功能。它将向您展示如何使用NFC、升级到WiFi/Bluetooth以及使用真实世界版本的结构化消息格式。查看诺基亚的NFC Talk项目,然后点击

谢谢你的回答。。这里我在代码中使用了reader.InputStreamOptions=InputStreamOptions.Partial,这意味着部分数据块,对吗?那么如何检测消息的结尾呢?我认为循环应该以4个字节继续,直到消息的结尾..我说的对吗。如何实现它?正如我在回答中所说,数据本身必须告诉您响应何时完成。我博客的链接解释了两种常见的方法。谢谢你的回答。。这里我在代码中使用了reader.InputStreamOptions=InputStreamOptions.Partial,这意味着部分数据块,对吗?那么如何检测消息的结尾呢?我认为循环应该以4个字节继续,直到消息的结尾..我说的对吗。如何实现它?正如我在回答中所说,数据本身必须告诉您响应何时完成。我的博客链接解释了两种常见的方法。