2014-08-27 1 views
0

Я использую Visual Studio 2010, а ОС - Windows 7, 64-разрядная. Проект, над которым я работаю, нуждается в функциональности XMPP; Для этого я использую библиотеку agsXMPP. Тип проекта - это клиент WPF, который выдает окно, которое остается там, пока выполняется мой код xmpp.Не удалось подключить клиента agsXmpp к серверу eJabberd

Я запускаю сервер eJabberd 2.1.3 в той же системе Windows, на которой я занимаюсь разработкой. Я также создал несколько учетных записей на сервере eJabberd (например, «aaa @ mydomain», «bbb @ mydomain» и т. Д.) И «дружил» друг с другом.

Для тестирования подключения к моему клиенту я использую клиент Pandion Jabber на Windows и клиент Xabber на моем Android в той же сети. Настройка работает нормально, и клиенты Xabber и Pandion могут обмениваться сообщениями друг с другом. Чтобы убедиться в отсутствии помех, я временно отключил брандмауэр.

Проблема: я не могу подключить свою программу к серверу eJabberd. При открытии окна присутствие других клиентов просто не отображается. Я использую следующий код:

string uname = "aaa", domain_server = "mydomain", resource = "res1", password = "password"; 

    Jid jid = new Jid (uname, domain_server, resource); 

    XmppClientConnection _xmppConn = new XmppClientConnection (jid.Server); 

    // This is my development machine's IP address 
    _xmppConn.ConnectServer = "192.168.0.101"; 

    _xmppConn.Server = domain_server; 

    _xmppConn.Open (jid.User, password); 

    // The event handlers: 
    _xmppConn.OnLogin += new ObjectHandler (_xmppConn_OnLogin); 
    _xmppConn.OnMessage += new agsXMPP.protocol.client.MessageHandler (_xmppConn_OnMessage); 

    void _xmppConn_OnMessage (object sender, agsXMPP.protocol.client.Message msg) { 
     MessageBox.Show (msg.Body); 
    } 

    void _xmppConn_OnLogin (object sender) { 
     MessageBox.Show ("Logged in"); 
    } 

тот же код работает отлично на Facebook чате, когда сообщение счета с другим FB счета.

string uname = "<my fb name>", domain_server = "facebook.com", resource = "res1", password = "<my password>"; 

    Jid jid = new Jid (uname, domain_server, resource); 

    XmppClientConnection _xmppConn = new XmppClientConnection (jid.Server); 

    _xmppConn.Server = "chat.facebook.com"; 

    _xmppConn.Open (jid.User, password); 

    // The event handlers: 
    _xmppConn.OnLogin += new ObjectHandler (_xmppConn_OnLogin); 
    _xmppConn.OnMessage += new agsXMPP.protocol.client.MessageHandler (_xmppConn_OnMessage); 

    void _xmppConn_OnMessage (object sender, agsXMPP.protocol.client.Message msg) { 
     MessageBox.Show (msg.Body); 
    } 

    void _xmppConn_OnLogin (object sender) { 
     MessageBox.Show ("Logged in"); 
    } 

Я ломаю себе голову, но просто не могу понять, где я могу ошибаться. Может ли кто-нибудь помочь? Заранее спасибо. :)

+0

Я не знаю много о agsxmpp, но, возможно, вам нужно отправить присутствие вручную после входа в систему? – legoscia

+0

@legoscia, я попытался добавить эту строку: _xmppConn.AutoPresence = true; в коде. Иди туда тоже. – Najeeb

+0

Работает ли 'telnet 192.168.0.101 5222'? – vitalyster

ответ

0

Я думаю, что я понял. Поскольку я работал в системе разработки, работающей с «обычным» доменом, то есть mydomain, а не известным TLD, разрешенным через общедоступный DNS, мне пришлось добавить запись в файл hosts, расположенный здесь:

C: \ Windows \ System32 \ Drivers \ Etc \ хостов

Добавлена ​​следующая запись (при условии, 192.168.0.101 в качестве IP-адрес вашего Dev системы):

192.168.0.101 MYDOMAIN

И закомментировать или удалите эту строку в коде:

_xmppConn.ConnectServer = "192.168.0.101";

Это позволит библиотеке определить адрес «mydomain» на IP-адрес, указанный в файле hosts выше на вашей локальной машине разработки.

Редактировать: Также убедитесь, что вы отключили IPV6 в своей системе. Смотрите эту тему: http://forum.ag-software.net/thread/682-agsXMPP-SDK-1-0-samples-How-to-call-server-on-loc

Инструкции о том, как отключить IPV6: http://www.techunboxed.com/2014/10/how-to-disable-ipv6-in-windows-10.html

0

Свойство ConnectServer игнорируется, пока не отключить автоматическое SRV разрешения с

xmppCon.AutoResolveConnectServer = false; 

Это должно решить вашу проблему.

+0

Хотел бы я сказать, что ваше решение лучше, чем мое, поскольку я чувствую, что всегда имеет смысл модифицировать код, а не адаптировать среду. Я попробовал это (что я и сделал ранее), но, к сожалению, он не работает. :(Спасибо за ваш ответ в любом случае. – Najeeb

0

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