0

我正在使用 PaulFreunds XMPP 库编写 Windows 8 聊天程序 - PaulFreund/XMPP

我有两个问题:首先 - 我需要手动绑定我的资源。我不知道在代码中放置边界资源标签的位置。它需要在客户端连接时发送,但我无法到达那个地方。连接客户端后,发送标签会导致我出错。标签:

        public void bindResource()
    {
        var iq = new XMPP.tags.jabber.client.iq();
        iq.type = XMPP.tags.jabber.client.iq.typeEnum.set;
        var bind = new XMPP.tags.xmpp_bind.bind();
        var resource = new XMPP.tags.xmpp_bind.resource();
        resource.Add("myresource");
        bind.Add(resource);
        iq.Add(bind);
        Client.Send(iq);
    }

第二个也很棘手。我想通过我的请求获取我的朋友列表:

        public void getFriends()
    {
        var iq = new XMPP.tags.jabber.iq.roster.query();
        var tag = new XMPP.tags.jabber.client.iq();
        tag.type = XMPP.tags.jabber.client.iq.typeEnum.get;
        tag.Add(iq);
        Client.Send(tag);
    }

它工作正常。但是在这里我也想在我从服务器获得有关状态的存在后处理它。(我们称它为服务器,因为我们都知道我们列表中的每个朋友都知道它)这是因为我在我的联系人列表中设置在线值。我可以像现在这样按顺序执行:第一个状态第二个朋友列表,但我需要制作一些我不想制作的缓存文件。我试图把它放在OnConnected事件中,但来自朋友的存在也早早地出现在我面前。

4

1 回答 1

0

该库实现了一个状态机,并且在您开始连接后一旦到达 BindingState 就应该自动向服务器发送一个绑定请求,请参阅States。当资源绑定成功时,您将通过 OnReceive 事件收到结果。

对于您的第二个问题,尽管在技术上可能是可行的,但并非有意。XMPP 存在在发布者订阅者模型上工作,模拟订阅者的客户端无法控制发布者何时发送新信息。即使服务器在连接时不会发布您的联系人的当前状态集,联系人也可能在那个时刻连接并且客户端会收到状态通知。名册管理是一项可选功能,不能替代您从状态中收集的信息(例如,名册不会告诉您联系人的状态)。

为了提供有关用户联系人的所有信息,您需要创建一个数据结构,其中包含额外的花名册信息和联系人的状态。

作为参考,您可以查看我的 Windows 8 messenger Chat实现,尽管它并不完美,但应该让您了解如何管理 XMPP 连接

于 2013-11-03T17:58:39.533 回答