我如何知道 StreamSocket 是否已连接
我在我这边测试了你的代码。如您所知,DataReader/DataWriter 本身并不关心“连接”。但是连接关闭会被方法检测到任务等待 https://msdn.microsoft.com/en-us/library/dd270644(v=vs.110).aspx,用于同步等待任务完成或抛出异常。所以在你的场景中,如果StreamSocked
之前已关闭DataReader.LoadAsync https://msdn.microsoft.com/nb-no/library/windows.storage.streams.datareader.loadasync.aspx, the taskLoad.AsTask().Wait(2000);
将抛出异常:
发生一个或多个错误。 (现有连接被远程主机强制关闭。)
如果套接字连接在期间关闭DataReader.LoadAsync
处理后,这次客户端无法检测到连接关闭,下次客户端向服务器发送消息时会检测连接关闭。在您的场景中,客户端将继续向服务器发送消息,服务器在发送新消息时始终捕获连接关闭。您将在以下位置收到连接关闭异常await writer.StoreAsync();
如果服务器关闭连接,则代码行。
但是在 5-6 条消息之后我的项目已经完成,我没有找到错误在哪里
您可能已经捕获了有关连接关闭的异常。所以这可能是由其他一些原因导致的。我看到了DataReader
在您的代码片段中,仅加载长度为1024的消息一次。因此,如果从服务器发送的消息长度超过1024,则客户端将仅收到部分消息,并且下次服务器发送新消息时,客户端仍将收到剩余的消息距离上次不是新消息。几次之后,服务器将回记录许多数据,并可能导致问题。我建议您更新reader.LoadAsync
代码如下:
string msg = string.Empty;
var loadsize = await reader.LoadAsync(ReadBufferLength);
while (loadsize >= ReadBufferLength)
{
loadsize = await reader.LoadAsync(ReadBufferLength);
}
if (reader.UnconsumedBufferLength > 0)
{
strBuilder.Append(reader.ReadString(reader.UnconsumedBufferLength));
}
此外,我强烈建议您使用流阅读器 https://msdn.microsoft.com/en-us/library/system.io.streamreader(v=vs.110).aspx相反,不会有这样的担忧DataReader
有,还有你的ReadResponse()
方法可以简单如下:
private async Task<String> ReadResponse()
{
Stream streamIn = socket.InputStream.AsStreamForRead();
StreamReader reader2 = new StreamReader(streamIn);
string response = await reader2.ReadLineAsync();
return response;
}
有关 uwp 中 StreamSocket 的更多详细信息,请参考官方样本 https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/StreamSocket.