0

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

在服务器端,当我传递“你好”时,我正在发送此文本的“很好,您正在接收来自服务器的消息”的响应。但是在我的“txtconnections”文本框中,只显示“Good”文本,因为我知道我已经在“LoadAsync”中传递了“4”。如果我将“4”增加到更多值,我可以显示所有内容。但是当 Tcp 对数据流进行操作时,我们如何知道响应流结束,或者如果“loadasync”中有“4”,我们将如何继续循环。有人可以帮我找到解决方案并简要解释一下..这里“UnconsumedBufferLength”包含“4”,从下一个开始它是“0”...

4

2 回答 2

2

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

诺基亚有一个端到端的示例,它可以启动 NFC 轻按和共享、打开 StreamSocket 并通过该套接字传输结构化消息。它将向您展示如何使用 NFC、升级到 WiFi/蓝牙以及使用真实版本的结构化消息格式。在此处和此处查看诺基亚的 NFC Talk 项目,了解有趣的部分

于 2013-02-14T00:05:56.850 回答
1

由于 TCP 对数据流进行操作,因此数据流本身必须告诉您响应何时完成。这通常使用长度前缀或分隔符来完成。我有一篇博客文章描述了这些不同的方法。

DataReader不是 TCP的一部分;它是一个通用的流阅读器和解释器。它实际上只是BitConverter使用了(很多)更好的 API。它只会从流中读取,无论您告诉它多少字节。您的代码已将LoadAsync流中的四个字节加载到阅读器中,但再也没有加载,因此您得到一个四字节字符串而没有其他内容是完全合理的。

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

于 2013-02-13T15:24:42.570 回答