簡體   English   中英

UWP,如何從StreamSocket讀取所有數據

[英]UWP, how to read ALL data from StreamSocket

我正在嘗試在C#中為UWP實現XMPP客戶端並實現這一點我正在使用StreamSocket進行TCP連接。

問題是,對於握手和SASL auth我需要服務器從客戶端“寫入和讀取”序列,沒有延遲我無法讀取服務器發送的所有數據; 我想刪除延遲部分。

這是我的代碼:

// Start handshake
await XmppWrite("<?xml version='1.0'?><stream:stream to='" + serverHostName.Domain + "' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>");
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("<?xml version='1.0'?><stream:stream to='" + serverHostName.Domain + "' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>");
responseStream = await XmppRead();

// Bind
await XmppWrite("<iq id='" + GenerateId() + "' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/></iq>");
responseStream = await XmppRead();
if (responseStream.Jid == null) return;

Jid = responseStream.Jid;

// Open session
await XmppWrite("<iq id='" + GenerateId() + "' type='set'><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/></iq>");
responseStream = await XmppRead();

XmppRead()方法是這樣的:

private async Task<XmppStream> 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();
}

所以,我認為問題是我嘗試在服務器完成之前讀取所有數據,因此我只能讀取部分消息。 如何檢查是否有其他數據沒有阻止?

謝謝。

(我正在尋找別的東西並看到了這個問題)

將DataReader.InputOptions設置為Partial時會發生什么? 現在,LoadAsync(AFAICT)將不會返回它的所有BUFFER_SIZE字節。 通過將輸入流選項設置為partial,您將獲得可用的任何內容。

DataReader文檔在這里 ,InputStreamOptions值在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM