我正在努力与android中的文件传输.我正在使用smack 4.1连接到openfire服务器.
我的问题是:
当我使用Spark来Spark文件传输时,它工作正常.但是当我将文件从Spark传输到Android或Android到Android时,iq收到显示错误“无法使用任何提供的主机建立套接字”,如下所示:
我的接收代码是:
FileTransferManager fileTransferManager = FileTransferManager.getInstanceFor(xmppTcpConnection);
fileTransferManager .addFileTransferListener(new FileTransferListener() {
@Override
public void fileTransferRequest(final FileTransferRequest request) {
final IncomingFileTransfer transfer = request.accept();
File file = new File("Path/To/Save",transfer.getFileName());
transfer.recieveFile(file);
}
});
我的ProviderManager代码是:
我使用ServiceDiscoveryManager和ProviderManager作为:
ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(AppConstant.xmppTcpConnection);
sdm.addFeature("http://jabber.org/protocol/disco#info");
sdm.addFeature("jabber:iq:privacy");
sdm.addFeature("jabber.org/protocol/si");
ProviderManager.addIQProvider("query","http://jabber.org/protocol/bytestreams",new BytestreamsProvider());
ProviderManager.addIQProvider("query","http://jabber.org/protocol/disco#items",new DiscoverItemsProvider());
ProviderManager.addIQProvider("query","http://jabber.org/protocol/disco#info",new DiscoverInfoProvider());
ProviderManager.addIQProvider("si","http://jabber.org/protocol/si",new StreamInitiationProvider());
并且,我还注册了一个谈判员:
FileTransferNegotiator fileTransferNegotiator = FileTransferNegotiator.getInstanceFor(xmppTcpConnection);
另外我在spark调试器中注意到:当spark to spark transfer时,会出现相同的消息,即无法与任何提供的主机建立套接字,但随后Spark会协商流和文件被转移.
但是当从spark转移到android时,iq从android设备收到相同的错误并且协商是由spark启动但是文件没有收到我的结尾.
任何人都可以指导我正确的方式.
谢谢.
更新:
Iq Sent :
在发送方收到错误IQ后,发送方再次向接收方发送IQ以进行文件传输协商流,但在此iq之后没有从接收方接收到iq.
此外,我正在使用以下smack库:
compile 'org.igniterealtime.smack:smack-android:4.1.1'
compile 'org.igniterealtime.smack:smack-core:4.1.1'
compile 'org.igniterealtime.smack:smack-tcp:4.1.1'
compile 'org.igniterealtime.smack:smack-extensions:4.1.1'
最佳答案
我得到了解决方案.问题在于smack sdk.
Smack在文件传输实现中有一些错误:在我的情况下,发起者提供了字节流和ibb方法,响应者接受两种(这是错误的)方法.
(参考:@vitalyster在这里回答Getting ExecutionException on receiving file using asmack in Android)
它应该只接受一个.
因此,在创建FileNegotiator时,我只提供了一个流:
FileTransferNegotiator fileTransferNegotiator = FileTransferNegotiator.getInstanceFor(xmppTcpConnection);
FileTransferNegotiator.IBB_ONLY = true;
现在文件传输工作正常.
感谢大家.