我正在客户端使用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" ...
答案 0 :(得分:2)
一旦你有一个StreamSocket开放式通信默认是非结构化的。意思是,您发送和接收字节流,并且您作为开发人员需要了解它们。如果你想传输一个随机长度的字符串,那就去吧,但是你必须构建蓝牙StreamSocket以期望它们。这样的结构可能看起来像 | 1字节,用信号发送版本号| 1字节来表示自由文本传输开始| 4字节以字节为单位传输字符串大小的int32 |以字节为单位的自由文本以指定长度| 4字节为单位字符串MD5 / SHA1哈希验证文件的内容| 。这真的取决于你的协议是什么样的,但请记住你必须发送和接收字节。
诺基亚{{}}启动了NFC分享和分享,打开了StreamSocket并通过该套接字传输结构化消息。它将向您展示如何使用NFC,升级到WiFi /蓝牙并使用真实版本的结构化消息格式。查看诺基亚的NFC Talk项目an end-to-end sample和here。
答案 1 :(得分:1)
由于TCP在数据流上运行,因此数据流本身必须告诉您响应何时完成。这通常使用长度前缀或分隔符来完成。 I have a blog post describing these different approaches.
DataReader
不是TCP的一部分;它是一个通用的流阅读器和解释器。实际上只有BitConverter
有一个(更好)的API。它只会从流中读取,但是你会告诉它很多字节。你的代码有LoadAsync
从流中加载四个字节进入阅读器,但从来没有,所以你得到一个四字节的字符串而不是别的。
如果可以,请更改协议以使用长度前缀。然后,使用DataReader
首先读取长度,然后阅读消息非常简单。如果无法更改协议,或者您使用分隔符,那么您需要读入partial chunks of data,直到您可以检测到消息的结束,然后保存所有剩余的数据以继续下一条消息的开头。