Передача файлов XMPP с использованием библиотеки Strophe

Может кто-нибудь дать мне знать реализацию передачи файлов в XMPP с использованием библиотеки strophe

2 ответа

Вы можете использовать si-filetransfer, я использовал его для отправки файла, но, похоже, не так быстро, как я хочу. он отправляет данные файла in-bind, поэтому будет немного медленнее, возможно, следует рассмотреть SOCKET5 bytestream(out-bind), но я раньше не пробовал.

демонстрационный файл отправки, параметр метода send() немного отличается, потому что я изменяю его, чтобы он соответствовал моему приложению, но в основном это то же самое. кадр как это

    // get Strohe.Connection
    getStropheConnection().si_filetransfer.send(file.id, 
        fullJid, sid, file.filename, file.size, filetype, function(err) {

        if(err) {
            // err happen
            return;
        } 

        // when codes comes here,mean your peer agree to receive your file
        // and we will use open to tell your peer you are going to send file
        // open: function (to, sid, bs, cb) 
        getStropheConnection().ibb.open(fullJid, sid, '4096', function(err) {

            if(err) {
                // err happen with open 
                return;
            }

            // code comes here, you can send data
            // call data method to send every peach of your file data
            // data: function (to, sid, seq, data, cb) 

            file.seq = 0; // the file sequence
            getStropheConnection().ibb.data(fullJid, sid, file.seq, d0, function(err) {

                if(err) {
                    // err happen  with data
                    return;
                }

                // repeat sending data util finish
                // call close tell your peer the file sending is finish
                // close: function (to, sid, cb) 
                getStropheConnection().ibb.close(fullJid, sid, function(err) {
                    if(err) {
                        // err happen with close
                        return;
                    }
                }.bind(this));
            }.bind(this));
        }.bind(this));
    }.bind(this));

и получить

_ibbReceiveFileCb : function(type, from, sid, data, seq, blocksize) {


    switch(type) {
        case "open":


          break;
        case "data":


          break;
        case "close":
            // every data through base64 encode, and 3 byte turn to 4 byte
            // compare receive size and file size make sure receive all data
            var resize = Math.ceil(file.blocksize * (file.seq + 1) / 4) * 3;
            var size = file.size; 
            if(resize >= size) {
                // receive all data
            } else {
                // not receive all data
            }
            break;
        default:
          throw new Error("shouldn't be here.");
      }
},

Извините за, не может дать полный код, потому что он содержит другой код, например, какой-то объект JSON для хранения данных, который может вас запутать. достаточно простой рамки

Я бы порекомендовал использовать XEP-0065: SOCKS5 Bytestreams, которые, я боюсь, вам понадобится кодировать самостоятельно.

Есть доступный плагин si-filetransfer. Вам нужно будет изучить код и добавить обработчик в соответствии с:

connection.si_filetransfer.(addhandler);

Тогда используйте это с:

   connection.si_filetransfer.send(to, sid, filename, size, mime, cb);

Я попробовал это раньше, но безуспешно, так как по какой-то причине он уничтожил мою связь с strophe. Может тебе повезет больше =)

Другие вопросы по тегам