当前位置:  开发笔记 > 编程语言 > 正文

UWP,如何从StreamSocket读取所有数据

如何解决《UWP,如何从StreamSocket读取所有数据》经验,为你挑选了0个好方法。

我正在尝试在C#中为UWP实现一个XMPP客户端,并实现这个我StreamSocket用于TCP连接.

问题是,对于握手而言,SASL auth我需要服务器从客户端"写入和读取"序列,并且没有延迟,我无法读取服务器发送的所有数据; 我想删除延迟部分.

这是我的代码:

// Start handshake
await XmppWrite("");
var responseStream = await XmppRead();

SaslPlain saslPlain = new SaslPlain(Username, Password);
responseStream = null;
String xml = null;
while (!saslPlain.IsCompleted && (xml = saslPlain.GetNextXml(responseStream)) != null)
{
    await XmppWrite(xml);
    responseStream = await XmppRead();
}
if (!saslPlain.IsSuccess) return;

// Request bind
await XmppWrite("");
responseStream = await XmppRead();

// Bind
await XmppWrite("");
responseStream = await XmppRead();
if (responseStream.Jid == null) return;

Jid = responseStream.Jid;

// Open session
await XmppWrite("");
responseStream = await XmppRead();

XmppRead()方法是这样的:

private async Task XmppRead()
{
    await Task.Delay(100); // Things don't works without this...
    var x = await dataReader.LoadAsync(BUFFER_SIZE);
    if (dataReader.UnconsumedBufferLength > 0)
    {
        Debug.WriteLine(x + ", " + dataReader.UnconsumedBufferLength);
        var stream = new XmppStream(dataReader.ReadString(dataReader.UnconsumedBufferLength));
        if (stream.IsError)
        {
            if (Error != null)
            {
                Error(this, new XmppClientEventArgs(stream));
            }
            throw new Exception(stream.Error);
        }
        return stream;
    }
    return new XmppStream();
}

所以,我认为问题是我尝试在服务器完成之前读取所有数据,因此我只能读取部分消息.如何检查是否有其他数据没有阻止?

谢谢.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有