Not sure what version “4.1.0-rc1” denotes, so I tested with nightly smack-4.1.0-beta3-SNAPSHOT-2015-02-12. Per your request, below is trace from getCause() . Regression tested with previous smack-4.1.0-beta2-SNAPSHOT-2015-01-14 and results were same as below. Also included Raw Sent Packets and Raw Received Packets via SmackConfiguration.DEBUG = true, and my java class that implements FileTransferListener interface.
**trace from getCause() **
-------------------------------------
Connected to the target VM, address: ‘127.0.0.1:*****’, transport: ‘socket’
Connecting to XMPP Server.
test-receiver@test.tester.net/Smack now connected to 10...****
Added supported discovery features.
Added IQ extension providers required to parse file transfer stanzas.
Started listening
file named: some.txt
File transfer accepted for stream Id jsi_754030307435725279
File transfer NEGOTIATING STREAM
File transfer NEGOTIATING STREAM
org.jivesoftware.smack.SmackException: org.jivesoftware.smack.SmackException$NoResponseException: No response received within packet reply timeout. Timeout was 5000ms (~5s)
File transfer ERROR
Transfer exception occurred: org.jivesoftware.smack.SmackException: Error in execution
at org.jivesoftware.smackx.filetransfer.FaultTolerantNegotiator.createIncomingStre am(FaultTolerantNegotiator.java:119)
at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$2.call(IncomingFileTr ansfer.java:186)
at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$2.call(IncomingFileTr ansfer.java:183)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer.negotiateStream(Incom ingFileTransfer.java:190)
at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer.access$100(IncomingFi leTransfer.java:57)
at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$1.run(IncomingFileTra nsfer.java:129)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.jivesoftware.smack.SmackException$NoResponseException: No response received within packet reply timeout. Timeout was 5000ms (~5s)
at org.jivesoftware.smackx.filetransfer.FaultTolerantNegotiator$NegotiatorService. call(FaultTolerantNegotiator.java:181)
at org.jivesoftware.smackx.filetransfer.FaultTolerantNegotiator$NegotiatorService. call(FaultTolerantNegotiator.java:170)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
… 1 more
Raw Sent Packets
--------------------------
<stream:stream xmlns=‘jabber:client’ to=‘test.tester.net’ xmlns:stream=‘http://etherx.jabber.org/streams’ version=‘1.0’ from=‘test-receiver@test.tester.net’ xml:lang=‘en’>
=
Y2hhcnNldD11dGYtOCx1c2VybmFtZT0icmFkLW Rpc2NvdmVyeS1yZWNlaXZlciIscmVhbG09InRhbGtpbnQuZW5lcm5vYy5uZXQiLG5vbmNlPSJUVjc3aH ZqN0Y0T3VQZ2JvcEZPQ0JwS0dWaWVJNzAzR1FSSzU0Rnc3IixuYz0wMDAwMDAwMSxjbm9uY2U9InJyam p1MlFSUFNiSFZGV2hxcjFPblJiK01ycGNmeThRNlZueDJQbEEiLGRpZ2VzdC11cmk9InhtcHAvdGFsa2 ludC5lbmVybm9jLm5ldCIsbWF4YnVmPTY1NTM2LHJlc3BvbnNlPWUyNGY1YzRlMmZjYzIwZWFkZjgwZW YwYjBiMTk1ODA4LHFvcD1hdXRo
<stream:stream xmlns=‘jabber:client’ to=‘test.tester.net’ xmlns:stream=‘http://etherx.jabber.org/streams’ version=‘1.0’ from=‘rad-discovery-receiver@test.tester.net’ id=‘87ee150’ xml:lang=‘en’>
Smack
http://jabber.org/protocol/bytestreams
http://jabber.org/protocol/ibb
<feature var='http://jabber.org/protocol/commands’/>
<feature var='http://jabber.org/protocol/file-transfer’/>
<feature var='http://jabber.org/protocol/xhtml-im’/>
<feature var='http://jabber.org/protocol/disco#items’/>
<feature var='http://jabber.org/protocol/bytestreams’/>
<feature var='http://jabber.org/protocol/ibb’/>
<feature var='http://jabber.org/protocol/muc’/>
<feature var='http://jabber.org/protocol/si’/>
<feature var='http://jabber.org/protocol/xdata-validate’/>
<feature var='http://jabber.org/protocol/xdata-layout’/>
<feature var='http://jabber.org/protocol/si/profile/file-transfer’/>
<feature var='http://jabber.org/protocol/disco#info’/>
Raw Received Packets
---------------------------------
<?xml version='1.0' encoding='UTF-8'?>
stream:featuresDIGEST-MD5PLAINCRAM-MD5zlib</stream:features>
cmVhbG09InRhbGtpbnQuZW5lcm5vYy5uZXQiLG 5vbmNlPSJUVjc3aHZqN0Y0T3VQZ2JvcEZPQ0JwS0dWaWVJNzAzR1FSSzU0Rnc3Iixxb3A9ImF1dGgiLG NoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNz
cnNwYXV0aD0xMDliYzE0YWQzNjEzZWFlZjg2Nj c1NWI0NmMwNTI1Yw==
<?xml version='1.0' encoding='UTF-8'?>zlib
test-receiver@test.tester.net/Smack
file named: some.txt
http://jabber.org/protocol/bytestreams
http://jabber.org/protocol/ibb
Implementation of FileTransferListener
----------------------------------------------------------
package com.test.tester;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream;
import org.jivesoftware.smackx.bytestreams.socks5.provider.BytestreamsProvider;
import org.jivesoftware.smackx.commands.provider.AdHocCommandDataProvider;
import org.jivesoftware.smackx.disco.ServiceDiscoveryManager;
import org.jivesoftware.smackx.disco.provider.DiscoverInfoProvider;
import org.jivesoftware.smackx.disco.provider.DiscoverItemsProvider;
import org.jivesoftware.smackx.filetransfer.*;
import org.jivesoftware.smackx.privacy.provider.PrivacyProvider;
import org.jivesoftware.smackx.si.provider.StreamInitiationProvider;
import java.io.File;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
class Listener implements FileTransferListener
{
public Listener(AbstractXMPPConnection receiverConnection, String directory)
{
connection = receiverConnection;
directoryToSaveFile = directory;
serviceDiscoveryManager = null;
manager = FileTransferManager.getInstanceFor(this.connection);
}
private AbstractXMPPConnection connection;
private ServiceDiscoveryManager serviceDiscoveryManager;
private String directoryToSaveFile;
private FileTransferManager manager;
public void AddServiceDiscoveryManagerFeatures()
{
serviceDiscoveryManager = ServiceDiscoveryManager.getInstanceFor(connection);
serviceDiscoveryManager.addFeature("[http://jabber.org/protocol/disco#info](http://jabber.org/protocol/disco#info)");
serviceDiscoveryManager.addFeature("jabber:iq:privacy");
serviceDiscoveryManager.addFeature("[http://jabber.org/protocol/file-transfer](http://jabber.org/protocol/file-transfer)");
serviceDiscoveryManager.addFeature("[http://jabber.org/protocol/si](http://jabber.org/protocol/si)");
serviceDiscoveryManager.addFeature("[http://jabber.org/protocol/bytestreams](http://jabber.org/protocol/bytestreams)");
//serviceDiscoveryManager.addFeature("[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb)");
System.out.println("Added supported discovery features.");
}
public void AddIQExtensionProviders()
{
ProviderManager.addIQProvider("query", "[http://jabber.org/protocol/disco#items](http://jabber.org/protocol/disco#items)", new DiscoverItemsProvider());
ProviderManager.addIQProvider("query", "[http://jabber.org/protocol/disco#info](http://jabber.org/protocol/disco#info)", new DiscoverInfoProvider());
ProviderManager.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());
ProviderManager.addIQProvider("malformed-action", "[http://jabber.org/protocol/commands](http://jabber.org/protocol/commands)", new AdHocCommandDataProvider());
ProviderManager.addIQProvider("si", "[http://jabber.org/protocol/si](http://jabber.org/protocol/si)", new StreamInitiationProvider());
//Parses a bytestream packet
//ProviderManager.addIQProvider("query", "[http://jabber.org/protocol/bytestreams](http://jabber.org/protocol/bytestreams)", new BytestreamsProvider());
ProviderManager.addIQProvider(Bytestream.QUERY_ELEMENT, Bytestream.NAMESPACE, new BytestreamsProvider());
ProviderManager.addIQProvider(Bytestream.StreamHost.ELEMENTNAME, Bytestream.NAMESPACE, new BytestreamsProvider());
ProviderManager.addIQProvider(Bytestream.StreamHostUsed.ELEMENTNAME, Bytestream.NAMESPACE, new BytestreamsProvider());
//Parses an In-Band Bytestream open packet.
//TODO: don't understand what IQProviders to use for IIB. This is not an asmack app, just desktop machine on Win7. Skipping IIB for now...
//ProviderManager.addIQProvider("open", "[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb)", new OpenIQProvider());
//ProviderManager.addIQProvider("data", "[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb)", new DataPacketProvider.IQProvider());
//ProviderManager.addIQProvider("close", "[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb)", new CloseIQProvider());
//ProviderManager.addExtensionProvider("data", "[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb)", new DataPacketProvider.PacketExtensionProvider());
System.out.println("Added IQ extension providers required to parse file transfer stanzas.");
}
public void startListening()
{
System.out.println("Started listening");
manager.addFileTransferListener(this);
}
public void stopListening()
{
manager.removeFileTransferListener(this);
System.out.println("Stopped listening");
}
/**
* Required implementation of interface. This is where the file transfer takes place
* @see FileTransferListener
* @param fileTransferRequest
*/
@Override
**public void fileTransferRequest(FileTransferRequest fileTransferRequest)**
{
try
{
final String uniqueFilename = String.format("%s_%s",UUID.randomUUID().toString(), fileTransferRequest.getFileName() );
final File file = new File( directoryToSaveFile + uniqueFilename );
System.out.println(fileTransferRequest.getDescription());
**IncomingFileTransfer transfer = fileTransferRequest.accept();**
System.out.println("File transfer accepted for stream Id " + fileTransferRequest.getStreamID());
/*** tried this approach, get same transfer error
InputStream inputStream = transfer.recieveFile();
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);
File targetFile = new File(directoryToSaveFile + uniqueFilename );
OutputStream outStream = new FileOutputStream(targetFile);
outStream.write(buffer);
***/
**transfer.recieveFile(file);** //give handle to file sys, which streams out buffered contents
while (!transfer.isDone())
{
Thread.sleep(2000L);
if (transfer.getStatus().equals(FileTransfer.Status.cancelled)) {
System.out.println("File transfer CANCELLED");
}
if (transfer.getStatus().equals(FileTransfer.Status.complete)) {
System.out.println("File transfer COMPLETE");
}
if (transfer.getStatus().equals(FileTransfer.Status.error)) {
System.out.println("File transfer ERROR");
transfer.cancel();
}
if (transfer.getStatus().equals(FileTransfer.Status.in_progress)) {
System.out.println("File transfer IN PROGRESS");
}
if (transfer.getStatus().equals(FileTransfer.Status.negotiating_transfer)) {
System.out.println("File transfer IN NEGOTIATING");
}
if (transfer.getStatus().equals(FileTransfer.Status.initial)) {
System.out.println("File now transfer INITIAL");
}
if (transfer.getStatus().equals(FileTransfer.Status.negotiating_stream)) {
System.out.println("File transfer NEGOTIATING STREAM");
}
if (transfer.getStatus().equals(FileTransfer.Status.refused)) {
System.out.println("File transfer REFUSED");
}
}
FileTransfer.Error transferError = transfer.getError();
if (transferError != null)
{
System.out.println(transferError.getMessage());
}
Exception transferException = transfer.getException();
if (transferException != null)
{
** System.out.println("Transfer exception occurred: " + transferException);**
** //FLOW, asked me to add this: it captures the stack frame for thread of interest**
** ExecutionException executionException = (ExecutionException) transferException.getCause();**
** if (executionException != null)**
** {**
** // this should be not null**
** Throwable causingException = executionException.getCause();**
** causingException.printStackTrace();**
}
}
if (transferError != null && transferException != null)
{
System.out.println("File receive SUCCEEDED!");
}
}
catch (SmackException se)
{
System.out.println("Caught SmackException in fileTransferRequest");
ExecutionException executionException = (ExecutionException) se.getCause();
if (executionException != null)
{
// this should be not null
Throwable causingException = executionException.getCause();
causingException.printStackTrace();
}
}
catch (Exception e)
{
ExecutionException executionException = (ExecutionException) e.getCause();
if (executionException != null)
{
// this should be not null
Throwable causingException = executionException.getCause();
causingException.printStackTrace();
}
System.out.println("Caught Exception in fileTransferRequest");
System.out.println(e.getMessage());
}
}
}