使用Strophe库进行XMPP文件传输

4

请问有人能告诉我如何使用strophe库在XMPP中实现文件传输吗?


你已经在http://stackoverflow.com/questions/6965303/file-transfer-using-jingle-in-xmpp和http://stackoverflow.com/questions/7291483/file-transfer-using-strophe-library上两次提出了这个问题,但都没有得到有用的反馈。重复问同一个问题是没有意义的。据我所知,Strophe.js不支持Jingle文件传输(XEP-0234),但可以为Strophe.js编写扩展--如何实现请阅读Jack Moffit的书“Professional XMPP Programming with JavaScript and jQuery”,或者在http://twitter.com/#metajack上与他联系。 - Raphael Bossek
非常感谢您的建议,实际上我是第一次发布问题。我发布了相同的问题两次,以为问题没有发布成功。 - HoneySam
3个回答

2

有一个 si-filetransfer 插件可用。 您需要研究代码并添加处理程序,类似于以下内容:

connection.si_filetransfer.(addhandler);

然后与之一起使用:

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

我之前尝试过,但不成功,因为它某种原因导致了我的strophe连接中断。也许你会更幸运 =)


2

2
你可以使用si-filetransfer来发送文件,但是它似乎不如我希望的快。它会在绑定内发送文件数据,所以速度有点慢。也许应该考虑使用SOCKET5字节流(非绑定),但我之前没有尝试过。
发送文件示例,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对象来保存数据,这可能会让您感到困惑。只有简单的框架就足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接