我StreamSocket
用于连接到套接字服务器,并且使用无限循环读取数据。每条数据均以结尾'\n\n'
。该代码段如下所示。但是,我不知道套接字是否仍然有效,并且每次服务器关闭连接时都会ReadAsync()
引发异常。连接关闭时如何通知?
public async Task<string> ReadData() {
StreamReader reader = new StreamReader(socket.InputStream.AsStreamForRead());
char[] ch = new char[65536];
int i = 0;
while (IsConnected) {
await reader.ReadAsync(ch, i++, 1);
if (i > 1 && ch[i - 1] == '\n' && ch[i - 2] == '\n') break;
}
return new StringBuilder().Append(ch, 0, i - 2).ToString();
}
每次服务器关闭连接时,ReadAsync()都会引发异常。
发生异常是因为发生不正常的断开连接。因此,在关闭服务器端的连接之前,请确保套接字上没有任何挂起的读或写操作,然后应该没有例外。您可以参考StreamSocket类的“备注”部分以获取更多详细信息。
连接关闭时如何通知?
另一端可以检测到正常的套接字关闭为0长度读取。也就是说,它就像常规流一样。这是一个类似的线程供您参考。
因此,您可以使用以下代码检查您的方案中是否关闭了连接:
// break when the connection is closed
if (ch[i - 1] == '\0') break;
以下是我已验证的整个方法:
public async Task<string> ReadData()
{
StreamReader reader = new StreamReader(socket.InputStream.AsStreamForRead());
char[] ch = new char[65536];
int i = 0;
while (true)
{
await reader.ReadAsync(ch, i++, 1);
// break when the connection is closed or data ends with '\n\n'
if (ch[i - 1] == '\0' || (i > 1 && ch[i - 1] == '\n' && ch[i - 2] == '\n')) break;
}
if (ch[i - 1] == '\0')
{
// do something here when the connection is closed
}
else
{
return new StringBuilder().Append(ch, 0, i - 2).ToString();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句