Хорошая библиотека С# XMPP, поддерживающая групповой чат и шифрование TLS или SSL

Поэтому я изо всех сил пытался найти достойную библиотеку C # для использования с XMPP, которая поддерживает шифрование SSL или TSL между клиентами и сервером. Я надеюсь, что кто-то может порекомендовать мне библиотеку, которая отвечает некоторым моим потребностям и довольно хорошо поддерживается/документирована. Также, возможно, кто-то может подтвердить мои подозрения относительно некоторых библиотек, которые я уже пробовал.

Моя первая попытка использовала Soapbox Studio SDK. Найти здесь от Conversant, однако, насколько я могу судить, они поддерживают только аутентификацию SASL. Я попытался связаться с ними, но не получил ответа, и форум, похоже, не работал, так как я не мог разместить свой вопрос на их форуме. Возможно, я ошибаюсь в своем предположении о SSL с библиотекой Soapbox, и было бы здорово, если бы кто-нибудь меня поправил, потому что это библиотека, которую я бы предпочел использовать.

Затем я перешел к Matrix, который является преемником agXmpp. После нескольких дней троллинга на их досках объявлений и изучения их примеров приложений я не могу даже создать групповой чат на своем сервере openfire. Почти все связанные вопросы, размещенные на форуме ag Software, побуждают людей использовать образцы приложений для ответа на свои вопросы. вопросы. Однако, если я что-то не понимаю, многие из их примеров приложений кажутся устаревшими или не подходящими для моих нужд. Следующий код является примером моей попытки использовать их библиотеки для создания группового чата. Если кто-то использовал их библиотеку, возможно, они могут указать, что я делаю неправильно.

Это мои директивы использования

using System;
using Matrix.Xmpp.Disco;
using Matrix.Xmpp.Client;
using Matrix.Xmpp.Session;
using Matrix.Xmpp;
using Matrix;

Вот код, который подключается к клиенту Xmpp

readonly XmppClient _xmppClient = new XmppClient();

public string Connect() {
   try
   {
       _xmppClient.SetUsername(OPENFIRE_USER_NAME);
       _xmppClient.Password = OPENFIRE_PASSWORD;
       _xmppClient.SetXmppDomain(OPENFIRE_SERVER);

       _xmppClient.Show = Matrix.Xmpp.Show.chat;
       _xmppClient.AutoRoster = true;
       _xmppClient.Open();

                return "Connection Succesful";
    }
    catch (Exception ex)
    {
       _logger.LogError("SessionManager", "Connect", "Could not connect to Openfire                     Server", ex.ToString());
                        return "Could not Connect to Openfire Server";
    }
}

и это код, который должен создать новый чат

public string CreateRoom(string roomName, string serverName, string userName)
{
    Jid groupJid = new Jid(userName, serverName, "gec2o");

    using (MucManager mucManager = new MucManager(_xmppClient))
    {
        mucManager.EnterRoom(groupJid, roomName, true);
        mucManager.RequestInstantRoom(groupJid);
    }

    return "";
}

Однако на сервере не создается чат и не генерируется никаких исключений. Также я знаю, что могу использовать их библиотеку для подключения к моему серверу, потому что я вижу, что мое имя для входа появляется в списке пользователей openfire. Несмотря на то, что все их классы задокументированы в файле, библиотека практически не дает комментариев о том, что на самом деле делает каждый класс/метод и как его следует использовать. Опять же, там форум в основном советует людям посмотреть пример кода, который в значительной степени бесполезен, и, как и мыльница, эта библиотека, похоже, не так хорошо поддерживается (похоже, что один разработчик отвечает на один вопрос).

Я кратко изучил другие библиотеки, такие как jabber-net, но оказалось, что это то же самое. история как Soapbox и Matrix с точки зрения поддержки и документации.

Я также наткнулся на IP*Works Internet Toolkit, но стоимость этой библиотеки кажется несколько завышенной.

Я понимаю, что сделал много предположений в этом вопросе, но я исследовал его уже несколько дней, и это лучшие выводы, к которым я смог прийти. Я надеюсь, что кто-то может либо исправить мои предположения, либо порекомендовать библиотеку, в которой нет проблем, с которыми я столкнулся.


person pat8719    schedule 10.06.2011    source источник
comment
MatriX отлично подходит для этого, я делаю то же самое с OpenFire. Можете ли вы опубликовать часть своего кода, которая открывает соединение XmppClient?   -  person jlew    schedule 10.06.2011
comment
@jlew Я только что включил в свой вопрос код, который показывает соединение.   -  person pat8719    schedule 10.06.2011


Ответы (2)


Большая часть XmppClient работает асинхронно. Когда вы вызываете что-то вроде client.Open(), он немедленно возвращается, но вам нужно подождать, пока он вызовет событие OnBind(), прежде чем что-либо делать с mucManager. Например:

    public class ChatRoom
    {
        private readonly ILogger _logger;
        private XmppClient _client;
        private MucManager _mucManager;

        public ChatRoom(ILogger logger)
        {
            _logger = logger;           
        }

        public string UserName { get; set; }
        public string Password { get; set; }
        public string XmppDomain { get; set; }
        public System.Uri BoshUri { get; set; }
        public string RoomJid { get; set; }
        public string RoomNick { get; set; }

        public void Start()
        {
            _client = new XmppClient(UserName, XmppDomain, Password);               
            _client.OnBind += (o, e) => _CreateChatRoom(_client, RoomJid, RoomNick);
            _client.OnSendXml += (o, e) => Trace(ConsoleColor.DarkGreen, "Sending:\n {0}", e.Text);
            _client.OnReceiveXml += (o, e) => Trace(ConsoleColor.DarkMagenta, "Receiving:\n {0}", e.Text);
            _client.OnError += (o, e) => Trace(ConsoleColor.Red, "Error: {0}", e.Exception);
            _client.Open();
            _client.Close(); 
        }
        private void Trace(ConsoleColor color, string msg, params object[] args)
        {
            var oldColor = _logger.Color;
            _logger.Color = color;
            _logger.Log(msg, args);
            _logger.Color = oldColor;
            Debug.WriteLine(msg, args);
        }

        private void _CreateChatRoom(XmppClient client, string chatRoomName, string roomNick)
        {
            _mucManager = new MucManager(client);
            _mucManager.EnterRoom(chatRoomName, roomNick);            
        }

        public void SendMessage(string text)
        {
            _client.Send(new Message("[email protected]", MessageType.groupchat, text));
        }

        public void End()
        {
            _client.Close();
        }

        public void Invite(Jid[] user)
        {
            _mucManager.Invite(user, RoomJid, "Come chat");
        }      
    }
person jlew    schedule 10.06.2011
comment
Итак, является ли создание комнаты чата при срабатывании события OnBind единственным способом «безопасно» создать комнату чата? - person pat8719; 13.06.2011
comment
в основном скопировал ваш способ создания чата и получил те же результаты. Есть ли какие-либо другие «ошибки», которые могут заставить меня сделать что-то не так. - person pat8719; 13.06.2011
comment
Какой сервер XMPP вы используете? Обычно полезно посмотреть на сообщения, отправляемые туда и обратно (OnSendXml/OnReceiveXml), и посмотреть, происходит ли что-то или нет. - person jlew; 20.06.2011
comment
+1 Полезно, чтобы выяснить, что не так с моей реализацией Matrix. - person pat8719; 06.07.2011

Таким образом, похоже, что все это время ответ на этот вопрос заключался в том, что моя исходная предпочтительная библиотека (Soapbox Studio SDK) на самом деле поддерживает шифрование TLS и, следовательно, была лучшим выбором все это время. Похоже, что TLS просто плохо документирован и/или я пропустил эту функцию.

В зависимости от конфигурации вашего сервера (я использую сервер Openfire), вы сможете настроить свой сервер так, чтобы он принимал только зашифрованные соединения. Вместо того, чтобы использовать SSL (который Openfire является устаревшим процессом со своего сервера) и пытаться подключиться через порт SSL 5223, простое подключение через порт по умолчанию (5222) и требование зашифрованного соединения заставит клиента отправлять данные с использованием TLS и автоматически согласовывать рукопожатие. Также сервер можно настроить таким образом, чтобы клиенты не создавали дополнительных пользователей. Управляя тем, какие клиенты могут создавать пользователей XMPP на вашем сервере, а не выдавать SSL-сертификаты, вы, таким образом, обеспечиваете безопасную связь повсюду.

person pat8719    schedule 05.07.2011