Передача файлов 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. Может тебе повезет больше =)