【发布时间】:2015-06-08 06:52:52
【问题描述】:
我们在新的 android 4.1.1 中实现了 FileTransfer 功能。 除了将文件传输到 iphone 客户端外,一切正常。协商时传输失败。
当使用 windows smack 客户端传输成功时,我们会收到以下日志。
D/SMACK(25089): SENT (0): <iq to='yeryes@192.168.100.239/QXmpp' id='tmfCy-335' type='set'><si xmlns='http://jabber.org/protocol/si' id='jsi_1094412687185521586' mime-type='image/jpeg' profile='http://jabber.org/protocol/si/profile/file-transfer'><file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="5_224724.jpg" size="630784" ><desc>normal</desc></file><feature xmlns="http://jabber.org/protocol/feature-neg"><x xmlns='jabber:x:data' type='form'><field var='stream-method' type='list-single'><option><value>http://jabber.org/protocol/bytestreams</value></option><option><value>http://jabber.org/protocol/ibb</value></option></field></x></feature></si></iq>
D/SMACK(25089): RECV (0): <iq from='yeryes@192.168.100.239/QXmpp' to='pgunjasfv@192.168.100.239/Tablet' id='tmfCy-335' type='result'><si xmlns='http://jabber.org/protocol/si' profile='http://jabber.org/protocol/si/profile/file-transfer'><feature xmlns='http://jabber.org/protocol/feature-neg'><x xmlns='jabber:x:data' type='submit'><field type='list-single' var='stream-method'><value>http://jabber.org/protocol/bytestreams</value></field></x></feature></si></iq>
D/SMACK(25089): SENT (0): <iq to='192.168.100.239' id='tmfCy-341' type='get'><query xmlns='http://jabber.org/protocol/disco#items'></query></iq>
D/SMACK(25089): SENT (0): <iq to='yeryes@192.168.100.239/QXmpp' id='tmfCy-353' type='set'><query xmlns='http://jabber.org/protocol/bytestreams' sid='jsi_1094412687185521586' mode='tcp'><streamhost jid='pgunjasfv@192.168.100.239/Tablet' host='192.168.100.133' port='7777'/><streamhost jid='pgunjasfv@192.168.100.239/Tablet' host='fe80::5cf8:a1ff:fe8b:b73b%p2p0' port='7777'/><streamhost jid='pgunjasfv@192.168.100.239/Tablet' host='fe80::5ef8:a1ff:fe8b:b73b%wlan0' port='7777'/><streamhost jid='proxy.192.168.100.239' host='192.168.100.239' port='7777'/></query></iq>
D/SMACK(25089): RECV (0): <iq from='yeryes@192.168.100.239/QXmpp' to='pgunjasfv@192.168.100.239/Tablet' id='tmfCy-353' type='result'><query xmlns='http://jabber.org/protocol/bytestreams' sid='jsi_1094412687185521586'><streamhost-used jid='pgunjasfv@192.168.100.239/Tablet'/></query></iq>
D/SMACK(25089): RECV (0): <iq from='192.168.100.239' to='pgunjasfv@192.168.100.239/Tablet' id='4072246770' type='get'><ping xmlns='urn:xmpp:ping'/></iq>
D/SMACK(25089): SENT (0): <iq to='192.168.100.239' id='4072246770' type='result'></iq>
当使用 iphone smack 客户端传输不成功时,我们会收到以下日志:
D/SMACK(25089): SENT (0): <iq to='iphone@192.168.100.239/iPad' id='tmfCy-441' type='set'><si xmlns='http://jabber.org/protocol/si' id='jsi_1968597579584741254' mime-type='image/jpeg' profile='http://jabber.org/protocol/si/profile/file-transfer'><file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="5_224724.jpg" size="630784" ><desc>normal</desc></file><feature xmlns="http://jabber.org/protocol/feature-neg"><x xmlns='jabber:x:data' type='form'><field var='stream-method' type='list-single'><option><value>http://jabber.org/protocol/bytestreams</value></option><option><value>http://jabber.org/protocol/ibb</value></option></field></x></feature></si></iq>
D/SMACK(25089): RECV (0): <iq from='iphone@192.168.100.239/iPad' to='pgunjasfv@192.168.100.239/Tablet' type='result' id='tmfCy-441'><si xmlns='http://jabber.org/protocol/si'><feature xmlns='http://jabber.org/protocol/feature-neg'><x xmlns='jabber:x:data' type='submit'><field var='stream-method'><value>http://jabber.org/protocol/bytestreams</value></field></x></feature></si></iq>
D/SMACK(25089): SENT (0): <iq to='iphone@192.168.100.239/iPad' id='tmfCy-443' type='get'><query xmlns='http://jabber.org/protocol/disco#info'></query></iq>
D/SMACK(25089): RECV (0): <iq from='iphone@192.168.100.239/iPad' to='pgunjasfv@192.168.100.239/Tablet' type='error' id='tmfCy-443'><query xmlns='http://jabber.org/protocol/disco#info'/><error type='cancel' code='501'><feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error></iq>
通过比较日志,我觉得这是为 xmpp 登录连接设置错误代理的问题。
XMPP 登录代码:
ProxyInfo proxy = new ProxyInfo(null, loc_IP, 7777, null,null);
我真的很想这样用,
ProxyInfo proxy = new ProxyInfo(ProxyType.SOCKS5, loc_IP, 7777, null,null);
,但随后登录过程失败。
= XMPPTCPConnectionConfiguration.builder()
.setProxyInfo(proxy)
.setServiceName(loc_IP)
.setHost(loc_IP)
.setPort(XMPP_PORT)
.setCompressionEnabled(false)
.setDebuggerEnabled(true)
.setCustomSSLContext(sslContext)
.setSecurityMode(SecurityMode.ifpossible)
.setHostnameVerifier(verifier)
.setUsernameAndPassword(username, pwd)
.setResource(resourcestring)
.build();
文件传输启用服务代码:
ServiceDiscoveryManager sdm=ServiceDiscoveryManager.getInstanceFor(main.login.connection);
if (sdm == null) {
sdm = ServiceDiscoveryManager.getInstanceFor(main.login.connection);
sdm.addFeature("http://jabber.org/protocol/disco#info");
sdm.addFeature("jabber:iq:privacy");
sdm.removeFeature("http://jabber.org/protocol/ibb");
}
SmackConfiguration.DEBUG = true;
// FileTransfer Service
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.getInstanceFor(main.login.connection);
fileTransferNegotiator.IBB_ONLY = false;
fileTransferManager = FileTransferManager.getInstanceFor(main.login.connection);
fileTransferManager.addFileTransferListener(fileTransferListener);
fileTransferListener =new FileTransferListener() {
@Override
public void fileTransferRequest(FileTransferRequest request) {
IncomingFileTransfer inComingFileTransfer = request.accept();
//followed by status handling code in a thread
}
};
【问题讨论】:
-
你能解决这个问题吗?