【发布时间】:2016-03-18 21:54:37
【问题描述】:
我正在尝试在 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();
}
所以,我认为问题在于我在服务器完成发送所有数据之前尝试读取,所以我只能读取部分消息。 如何检查是否还有其他没有阻塞的数据?
谢谢。
【问题讨论】:
标签: c# uwp stream-socket-client