Ошибка потока xmpp

Hi

I am getting below error when I am sending multiple messages to the server through node-xmpp-client

{ [Error]
  stanza:
   Stanza {
     name: 'stream:error',
     parent: null,
     children: [ [Object] ],
     attrs: { 'xmlns:stream': 'http://etherx.jabber.org/streams' } } }

please note code works perfectly fine , when we send chat one by one , code only fails when I send multiple chats simultaneously through a script ( it was a part of stress testing we had to do before putting this in production) ,

Behavior is if script is sending 10 messages 3 our lost rest 7 are lost because of this error.

Can you please give any directions to resolve this

My code is mentioned below

/Packages we need
var express = require('express');
var bodyParser = require('body-parser');
var app        = express();
var morgan     = require('morgan');
var xmpp = require('node-xmpp-client');






// configure app to use bodyParser()
// this will let us get the data from a POST
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var port = process.env.PORT || 8060;        // set our port

// ROUTES FOR OUR API
// =============================================================================
var router = express.Router();              // get an instance of the express Router

// test route to make sure everything is working (accessed at GET http://localhost:8080/api)
router.get('/', function(req, res) {
    res.json({ message: 'hooray! welcome to our api!' });  
});

app.use('/api', router);







// This responds a POST request for the homepage
app.post('/', function (req, res) {
   console.log("Got a POST request for the homepage");
    var message = req.body.message;
    var to = req.body.to;
//XMPP Account Details Starts from Here
var client_id = "user@jab.cp.xyz.com"; //Use any XMPP Supported Account like Gmail
var client_pwd = "password";
var client_host = "jab.cp.xyz.com";  //talk.google.com for gmail
var client_port = "5222";   //5222
var status_msg = "I am Online?";   //Set it as you want

var client = new xmpp.Client({ jid: client_id,
password: client_pwd,
host: client_host,
port: client_port
});
client.on('online', function () {
  console.log('Client is online1')
  client.send('<presence/>')

    client.on('stanza', function (stanza) {
    var reply = new xmpp.Client.Stanza('message', {
      //to: stanza.attrs.from,
        to: to,
      from: stanza.attrs.to,
      type: 'chat'
    })
   console.log("Got a POST request for the homepage1");
    reply.c('body').t(message);
   // console.log("Got a POST request for the homepage2");
      client.send(reply)
      // console.log("Got a POST request for the homepage3");

res.send(message + ' ' + to);
        client.end()
    })
})

client.on('error', function (e) {
  console.error(e)
  //process.exit(1)
})


})






app.listen(port);
console.log('Magic happens on port ' + port);

В настоящее время я работаю с XMPP/Jabber chat для android.я просто попытался с Openfire и попытаться подключить свою учетную запись jabber.соединение было успешным.но я не могу послать никакого сообщения.это показывает некоторую ошибку конфликта.проверьте журнал ошибок.дайте мне решение для этого.

Initializing connection to server eworks port 5222
Connected: true
Creating entry for buddy 'testuser2' with name testuser2
Sending mesage 'Hello mate' to user testuser2@eworks
Buddy:testuser2 - Status:null
stream:error (conflict)
at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:306)
at org.jivesoftware.smack.PacketReader.access0(PacketReader.java:44)
at org.jivesoftware.smack.PacketReader.run(PacketReader.java:76)

1 ответов


A XMPP stream:error из-за конфликта означает, что уже существует соединение с тем же полным JID (то есть голый JID и часть ресурса).

большинство серверов XMPP могут обрабатывать конфликты путем повторного назначения другого ресурса после обнаружения конфликта. Это поведение можно настроить.


К сожалению, не всегда удается подключиться к Jabber серверу без настройки клиента. Сначала необходимо определить, что мешает подключению.

Локальные проблемы[править]

Для определения характера проблемы надо выполнить следующие действия:

  • Windows:
    • Запустить консоль, щелкнув по кнопке Пуск (Start), затем выбрав Все программы->Стандартные->Командная строка.
    • В открывшемся окне наберите telnet имя_сервера 5222 и нажмите Enter. Пример:
telnet jabber.ru 5222
  • Unix-like:
    • Запустить консоль, используя средства Вашего DE/WM. Если Вы не знаете, как это сделать — нажмите Ctrl-Alt-F1 и войдите от своего имени.
    • В открывшемся окне наберите telnet имя_сервера 5222 и нажмите Enter. Пример:
telnet jabber.ru 5222

В Windows после этих действия окно должно стать полностью черным и только на верхней строке будет мигать курсор. Далее нажмите любую букву, но на экране вы ее не увидите (таковы особенности работы Telnet-клиента в Windows), а затем клавишу Enter. Появится текст, похожий на приведённый ниже.

<?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'
id='none' from='jabber.ru' version='1.0'><stream:error><xml-not-well-formed
xmlns='urn:ietf:params:xml:ns:xmpp-streams'/></stream:error></stream:stream>
Connection to host lost.

С доступностью сервера всё в порядке и причина в неверной настройке клиента, либо проблемами, которые препятствуют самому подключению. Например, неверный пароль или попытка получить новую учетную запись, когда она уже существует на сервере.

Если же на экране отображается около минуты

Connecting To jabber.ru...

а затем

Could not open a connection to host on port 5222 : Connect failed

Это значит, что действительно по какой-то причине нет соединения с сервером. Попробуйте выполнить тоже самое, указав другой сервер. Например, telnet jabber.org 5222.

В случае неудачи вам следует поразмыслить, какие настройки вашей операционной системы могут препятствовать соединению на 5222 порт.
Это может быть следствие работы программного брандмауэера (firewall), в правилах которого указано запрещать соединения с интернет определенным программам (тому же Telnet).

Удаленные проблемы[править]

Если Вы точно уверены, что брандмауэр не запрещает Telnet доступ в Интернет, но соединения с сервером все ещё нет, то проблема связана со способом выхода в сеть. Чаще всего подобная проблема возникает при работе из сети предприятия. Возможные проблемы и способы их решения можно узнать ниже.

Прокси[править]

Пример настройки прокси в Psi

Довольно распространен способ выхода в Интернет через прокси. В первую очередь необходимо узнать настройки прокси. Самый простой вариант — посмотреть настройки браузера:

  • в случае с Firefox они располагаются на странице «Дополнительно» настроек, вкладке «Сеть» в разделе «Соединение«
  • в случае Internet Explorer 6 — «Сервис» — «Свойства обозревателя» — «Подключения» — «Настройка LAN» — «Прокси-сервер» — «Дополнительно«

Необходимы три параметра: тип, адрес и порт. Откройте настройки Вашего Jabber-клиента в разделе прокси (в случае Psi это «Меню«->»Аккаунты«->»Изменить«->»Соединение«->»Прокси-сервер«->»Изменить«-«Создать«), впишите туда адрес прокси-сервера и порт. Не забывайте правильно указать тип. Пример настройки можно увидеть справа, однако параметры, указанные на изображении, могут не совпадать с Вашими параметрами. После выполнения настройки можно подключаться.

Если ваш клиент не поддерживает работу через прокси-сервер[править]

или с подключением какие-либо проблемы, можно создать туннель через прокси, например с помощью утилиты socat (есть практически в любом дистрибутиве Linux, в Macports, также существуют бинарные сборки для Windows/Cygwin):

./socat TCP4-LISTEN:13666,reuseaddr,fork PROXY:your-proxy:allports.jabber.ru:443,proxyport=8080

В данном примере мы создаем туннель через прокси-сервер с адресом your-proxy:8080 с порта 13666 локальной машины на 443-й порт сервера allports.jabber.ru. Теперь в настройках аккаунта указываем нашему клиенту сервер подключения — localhost (127.0.0.1) и порт 13666.

Блокирование портов[править]

Иногда стандартные порты для соединения с Jabber сервером (5222 и 5223) закрыты. В этом случае можно попробовать использовать нестандартный порт. Не все сервера предоставляют доступ по нестандартным портам. Если Вы нашли свой сервер в этой таблице — введите настройках своего клиента указанные там хост (адрес для подключения) и один из перечисленных нестандартных портов. Если у вашего сервера есть несколько нестандартных портов, то сначала надо попробовать порт 443, при этом SSL должно быть включено. Как правило, этот порт открыт. Если этот порт закрыт, то нужно пробовать другие из списка.

Не нужно путать хост (адрес для подключения) и адрес сервера из JID. Адрес сервера из JID не зависит ни от хоста, ни от способа подключения. По этой причине JID’ы вида «someuser@allports.jabber.ru» не являются корректными и не следует его писать в соответствующее поле в настройках клиента. В данном примере в поле JID необходимо записать «someuser@jabber.ru», а «allports.jabber.ru» следует записать в поле «хост».

HTTP Polling/Binding[править]

Иногда выход в сеть разрешается только по протоколу HTTP. В таком случае необходимо использовать HTTP Polling/Binding. Как правило, настройки HTTP Polling располагаются там же, где и настройки прокси. В случае с Psi специально выделен тип HTTP Polling. В этом случае нужно узнать так называемый «URL для поллинга». Его можно посмотреть в этой таблице. Остальные поля нужно заполнять только в том случае, если используется прокси (см. выше).

Веб-клиент[править]

Если ничего из вышеперечисленного не помогает — то возможно использование веб-клиента. Это не так удобно, как обычный клиент, но в данной ситуации может быть решением. Выбрать наиболее подходящий веб-клиент можно на этой странице.

just letting you know that I have inherited this project so that you know that I don’t have precise knowledge of how this all was implemented.

Project: XMPP/Jabber chat client on iOS with PHP server backing

I am testing the app on two physical iPhone devices.

It appears the app is sending the messages that it should be sending across the XMPP stream, but the app is definitely not receiving those messages.

Every time an app should receive a message, it instead re-negociates the XMPP handshake that it does at the start of the application’s run.

Looking into this, I found that either the stream was disconnecting or something similar. Here are two log messages I implemented. They contain the method name that is running and the contents of the NSError associated with that method

2014-02-06 18:28:50.140 AppName[9841:473b] --Socket Closed With Error--
Domain: (null)
UserInfo: (null)
2014-02-06 18:28:50.147 AppName[9841:60b] --xmppStreamDidDisconnect--
Domain: libxmlErrorDomain
UserInfo: {
    NSLocalizedDescription = "Couldn't find end of Start Tag body\n";
}

Hypothesis 1: Most obviously, I look to the error domain and description.
No luck yet finding the «couldn’t find the end of Start Tag body», however

Hypothesis 2:
I read on some forum that XMPP streams can disconnect if multiple devices are attempting to log into the same server with the same credentials. I fear THIS might be what is going on here, but how do I find out if these are the same credentials. The two devices are using two different usernames/userids and I believed this would be sufficient for XMPP.

They ARE using the same IP, but that would be natural for XMPP, no?

ex. of JIDs used:

   user1@my.site.ip
   user2@my.site.ip

Обновлено

Вопрос:

Я Grid.Children.Clear() метод, который имеет функцию Grid.Children.Clear(). При вызове его из разных методов он работает хорошо. Но когда я вызываю свой метод из метода xmpp_onmessage. Я испытываю ошибку. “Вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток”.

Вот метод, который содержит Grid.Children.Clear():

 private void ConstructChatView(Boolean isChat)
{
System.Uri resourceUri = new System.Uri("Public/Images/chat_green-textarea.png", UriKind.Relative);
StreamResourceInfo streamInfo = Application.GetResourceStream(resourceUri);

System.Uri resourceUri2 = new System.Uri("Public/Images/chat_green-textarea-tail.png", UriKind.Relative);
StreamResourceInfo streamInfo2 = Application.GetResourceStream(resourceUri2);

System.Uri resourceUri3 = new System.Uri("Public/Images/chat_blue-textarea.png", UriKind.Relative);
StreamResourceInfo streamInfo3 = Application.GetResourceStream(resourceUri3);

System.Uri resourceUri4 = new System.Uri("Public/Images/chat_blue-textarea-tail.png", UriKind.Relative);
StreamResourceInfo streamInfo4 = Application.GetResourceStream(resourceUri4);


BitmapFrame temp = BitmapFrame.Create(streamInfo.Stream);
var brush = new ImageBrush();
brush.ImageSource = temp;

BitmapFrame temp2 = BitmapFrame.Create(streamInfo2.Stream);

BitmapFrame temp3 = BitmapFrame.Create(streamInfo3.Stream);
var brush2 = new ImageBrush();
brush2.ImageSource = temp3;

BitmapFrame temp4 = BitmapFrame.Create(streamInfo4.Stream);

int ctr = 0;
chatGrid.Children.Clear();
if (isChat == true)
{
for (int i = 0; i < _messageView.Count; i++)
{

if ((!_messageView.ElementAt(i).Message.ToString().Trim().Equals("")))
{
RowDefinition chatGridRow1 = new RowDefinition();
RowDefinition chatGridRow2 = new RowDefinition();
RowDefinition chatGridRow3 = new RowDefinition();

chatGrid.RowDefinitions.Add(chatGridRow1);
chatGrid.RowDefinitions.Add(chatGridRow2);
chatGrid.RowDefinitions.Add(chatGridRow3);

if (_messageView.ElementAt(i).IsMe == true)
{
TextBlock Message = new TextBlock();
Message.Foreground = Brushes.White;
Message.Padding = new Thickness(10, 10, 10, 10);
Message.HorizontalAlignment = HorizontalAlignment.Right;
Message.Margin = new Thickness(0, 0, 5, 0);
Message.Background = brush2;
Message.TextWrapping = TextWrapping.Wrap;
Message.Text = _messageView.ElementAt(i).Message;
Grid.SetRow(Message, ctr);
Grid.SetColumn(Message, 0);
ctr++;

Image Bluetail = new Image();
Bluetail.Source = temp4;
Bluetail.HorizontalAlignment = HorizontalAlignment.Right;
Bluetail.Height = 10;
Bluetail.Width = 20;
Bluetail.Margin = new Thickness(0, -(0.7), 10, 0);
Grid.SetRow(Bluetail, ctr);
ctr++;

Label Sender = new Label();
Sender.Foreground = Brushes.White;
Sender.Margin = new Thickness(0, 0, 0, 10);
Sender.HorizontalAlignment = HorizontalAlignment.Right;
Sender.Content = "Sent By : " + _messageView.ElementAt(i).Name.ToString() + " " + _messageView.ElementAt(i).DateCreated.ToString();
Grid.SetRow(Sender, ctr);
Grid.SetColumn(Sender, 0);
ctr++;

chatGrid.Children.Add(Message);
chatGrid.Children.Add(Bluetail);
chatGrid.Children.Add(Sender);
}
else
{
TextBlock Message = new TextBlock();
Message.Foreground = Brushes.White;
Message.Padding = new Thickness(10, 10, 10, 10);
Message.HorizontalAlignment = HorizontalAlignment.Left;
Message.Margin = new Thickness(5, 0, 0, 0);
Message.Background = brush;
Message.TextWrapping = TextWrapping.Wrap;
Message.Text = _messageView.ElementAt(i).Message;
Grid.SetRow(Message, ctr);
Grid.SetColumn(Message, 0);
ctr++;

Image Greentail = new Image();
Greentail.Source = temp2;
Greentail.HorizontalAlignment = HorizontalAlignment.Left;
Greentail.Height = 10;
Greentail.Width = 20;
Greentail.Margin = new Thickness(10, -(0.7), 5, 0);
Grid.SetRow(Greentail, ctr);
ctr++;

Label Sender = new Label();
Sender.Foreground = Brushes.White;
Sender.Margin = new Thickness(0, 0, 0, 10);
Sender.HorizontalAlignment = HorizontalAlignment.Left;
Sender.Content = "Sent By : " + _messageView.ElementAt(i).Name.ToString() + " " + _messageView.ElementAt(i).DateCreated.ToString();
Grid.SetRow(Sender, ctr);
Grid.SetColumn(Sender, 0);
ctr++;

chatGrid.Children.Add(Message);
chatGrid.Children.Add(Greentail);
chatGrid.Children.Add(Sender);
}
}

}
}
else
{
for (int i = 0; i < _messageView.Count; i++)
{

if (_messageView.ElementAt(i).IsMe == true && (!_messageView.ElementAt(i).Message.ToString().Trim().Equals("")))
{
RowDefinition chatGridRow1 = new RowDefinition();
RowDefinition chatGridRow2 = new RowDefinition();
RowDefinition chatGridRow3 = new RowDefinition();

chatGrid.RowDefinitions.Add(chatGridRow1);
chatGrid.RowDefinitions.Add(chatGridRow2);
chatGrid.RowDefinitions.Add(chatGridRow3);


TextBlock Message = new TextBlock();
Message.Foreground = Brushes.White;
Message.Margin = new Thickness(0, 10, 300, 0);
Message.Padding = new Thickness(10, 10, 10, 10);
Message.HorizontalAlignment = HorizontalAlignment.Left;
Message.Background = brush;
Message.TextWrapping = TextWrapping.Wrap;
Message.Text = _messageView.ElementAt(i).Message;
Grid.SetRow(Message, ctr);
Grid.SetColumn(Message, 0);
ctr++;

Image Greentail = new Image();
Greentail.Source = temp2;
Greentail.HorizontalAlignment = HorizontalAlignment.Left;
Greentail.Height = 10;
Greentail.Width = 20;
Greentail.Margin = new Thickness(5, -(0.7), 0, 0);
Grid.SetRow(Greentail, ctr);
ctr++;

Label Sender = new Label();
Sender.Foreground = Brushes.White;
Sender.Margin = new Thickness(0, 0, 0, 10);
Sender.Content = "Sent By : " + _messageView.ElementAt(i).Name.ToString() + " " + _messageView.ElementAt(i).DateCreated.ToString();
Grid.SetRow(Sender, ctr);
Grid.SetColumn(Sender, 0);
ctr++;

chatGrid.Children.Add(Message);
chatGrid.Children.Add(Greentail);
chatGrid.Children.Add(Sender);
}

}
}
//for (int i = 0; i < _messageView.Count; i++)
//{
//    if (_messageView.ElementAt(i).IsMe == true && (!_messageView.ElementAt(i).Message.ToString().Trim().Equals("")))
//    {
//    }


//}
ctr = 0;

scrollView.ScrollToEnd();
}

Есть идеи? благодаря

Лучший ответ:

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

private void ConstructChatView(Boolean isChat)
{
    Dispatcher.Invoke((Action)(() => chatGrid.Children.Clear()));
}

EDIT: вы также можете передать дополнительный код вызову Invoke с помощью анонимного метода:

private void ConstructChatView(Boolean isChat)
{
    Dispatcher.Invoke((Action)(() =>
        {
            // more code here
        }));
}

Конечно, вы также можете добавить кучу кода в другой метод и передать его вызову Invoke:

private void ConstructChatView(Boolean isChat)
{
    Dispatcher.Invoke((Action)(() => ConstructChatViewInUI(isChat)));
}

private void ConstructChatViewInUI(Boolean isChat)
{
    ...
}

Понравилась статья? Поделить с друзьями:
  • Ошибка почты 0x80040600
  • Ошибка потеряно соединение тарков
  • Ошибка почтового сервера 554
  • Ошибка потока iptv
  • Ошибка почтового сервера 552