我有一个应用程序,我写的Windows 8 / WinRT中使用的StreamSocket API做一个流连接到服务器。 也就是说,服务器流数据到客户端,有时meta标签,并且可以随时断开。
我遇到的问题是,我不知道如何当服务器已断开检测。 似乎没有要上StreamSocket类的任何事件或属性,无论是它的输入或输出流,或者有什么关系连接状态的DataReader / DataWriter类。
最重要的是,DataReader的方法ReadAsync没有来自客户端的服务器端断开连接后失败。 相反,操作,据我可以告诉成功,它填补到其缓冲区中的数据仅仅是过去的事情发送给它(即它不清除其内部缓冲区,即使我能看到它的服务器“消耗”每一个我称之为ReadByte时间)的缓冲区。 它这样做是为给ReadAsync每个后续调用 - 补充什么才最后断开发送服务器的缓冲区。 下面是代码的简化版本:
public async Task TestSocketConnectionAsync()
{
var socket = new StreamSocket();
await socket.ConnectAsync(new HostName(Host), Port.ToString(),
SocketProtectionLevel.PlainSocket);
var dr = new DataReader(socket.InputStream);
dr.InputStreamOptions = InputStreamOptions.Partial;
this.cts = new CancellationTokenSource();
this.listenerOperation = StartListeningAsync(dr, cts);
}
public async Task StartListeningAsync(DataReader dr, CancellationTokenSource cts)
{
var token = cts.Token;
while (true)
{
token.ThrowIfCancellationRequested();
var readOperation = dr.LoadAsync(1024);
var result = await readOperation;
if (result <= 0 || readOperation.Status != Windows.Foundation.AsyncStatus.Completed)
{
cts.Cancel(); // never gets called, status is always Completed, result always > 0
}
else
{
while (dr.UnconsumedBufferLength > 0)
{
byte nextByte = dr.ReadByte();
// DriveStateMachine(nextByte);
}
}
}
}