Имена переменных, используемые в следующих обсуждениях:
| название | Смысл |
| MyHost | Имя хоста машины, на которой работает Openfire. |
| user1 @ MyHost | Пользователь инициатора передачи файлов |
| user2 @ MyHost | Получатель файла |
Как узнать, какой хост выбран для байтовых потоков: (Следующие XML-файлы показаны по мере их отправки и получения инициатору передачи файлов.)
- Сначала запросите у другого клиента информацию о поддерживаемых функциях:
Отправлено:
|
1
2
3
|
<iq id='x1ixz-13' to='user2@myHost/Smack' type='get'></iq> |
Получено:
|
1
2
3
4
5
6
7
|
<iq id='x1ixz-13' to='user1@myHost/Smack' type='result' from='user2@myHost/Smack'> <!—some other items --> <!—some other items --> </query></iq> |
Здесь вы можете узнать, поддерживается ли передача файла bytestream на стороне клиента или нет. Если в ответ вы видите XML-код, подобный приведенному выше, он поддерживается на другой стороне, и вы можете пойти дальше.
- Сервер запросов для элементов диско:
Отправлено:
|
1
2
3
|
<iq id='x1ixz-14' to='myHost' type='get'></iq> |
Получено:
|
1
2
3
4
5
6
7
|
<iq type='result' id='x1ixz-14' from='myHost' to='user1@ myHost /Smack'> <!—some other items --> <item jid='proxy. myHost ' name='Socks 5 Bytestreams Proxy'/> <!—some other items --> </query></iq> |
Здесь вы получите различные элементы для различных элементов, поддерживаемых сервером, например, прокси для передачи файлов, службы поиска, конференц-службы … Элемент, который мы должны искать, это «Socks 5 Bytestreams Proxy».
- Запрос дополнительной информации о прокси
Отправлено:
|
1
2
3
|
<iq id='x1ixz-19' to='proxy. myHost ' type='get'></iq> |
Получено:
|
1
2
3
4
5
|
<iq type='result' id='x1ixz-19' from='proxy. myHost ' to='user1@ myHost /Smack'> <streamhost jid='proxy. myHost ' host=' myHost ' port='7777'/> </query></iq> |
Здесь хост в <streamhost> является ключом для передачи файла. Вы должны убедиться, что этот хост доступен с вашего телефона Android. Он не должен быть похож на localhost, 127.0.0.1 или какой-либо другой внутренний сервер компании, который недоступен за пределами компании. Это должен быть общедоступный IP-адрес или хост.
Чтобы настроить соответствующий прокси, добавьте / измените эти 3 свойства в Openfire:
- xmpp.proxy.enabled — правда
- xmpp.proxy.port — 7777
- xmpp.proxy.externalip — [общедоступный хост или ip]
Код для передачи файлов:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
FileTransferManager manager = new FileTransferManager(connection);OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer('usre2@myHost/Smack');File file = new File(filenameWithPath);try { transfer.sendFile(file, 'test_file');} catch (XMPPException e) { e.printStackTrace();}while(!transfer.isDone()) { if(transfer.getStatus().equals(Status.error)) { System.out.println('ERROR!!! ' + transfer.getError()); } else if (transfer.getStatus().equals(Status.cancelled) || transfer.getStatus().equals(Status.refused)) { System.out.println('Cancelled!!! ' + transfer.getError()); } try { Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); }}if(transfer.getStatus().equals(Status.refused) || transfer.getStatus().equals(Status.error) || transfer.getStatus().equals(Status.cancelled)){ System.out.println('refused cancelled error ' + transfer.getError());} else { System.out.println('Success');} |
И код для файла получают:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
FileTransferManager manager = new FileTransferManager(connection);manager.addFileTransferListener(new FileTransferListener() { public void fileTransferRequest(final FileTransferRequest request) { new Thread(){ @Override public void run() { IncomingFileTransfer transfer = request.accept(); File mf = Environment.getExternalStorageDirectory(); File file = new File(mf.getAbsoluteFile()+'/DCIM/Camera/' + transfer.getFileName()); try{ transfer.recieveFile(file); while(!transfer.isDone()) { try{ Thread.sleep(1000L); }catch (Exception e) { Log.e('', e.getMessage()); } if(transfer.getStatus().equals(Status.error)) { Log.e('ERROR!!! ', transfer.getError() + ''); } if(transfer.getException() != null) { transfer.getException().printStackTrace(); } } }catch (Exception e) { Log.e('', e.getMessage()); } }; }.start(); } }); |
Также сконфигурируйте ProviderManager для правильного декодирования / разбора байтов и других необходимых xmls:
|
1
2
3
|
ProviderManager.getInstance().addIQProvider('query','http://jabber.org/protocol/bytestreams', new BytestreamsProvider());ProviderManager.getInstance().addIQProvider('query','http://jabber.org/protocol/disco#items', new DiscoverItemsProvider());ProviderManager.getInstance().addIQProvider('query','http://jabber.org/protocol/disco#info', new DiscoverInfoProvider()); |
Я использовал библиотеку asmack asmack-jse-buddycloud.jar.
Ссылка: передача файлов в Android с Asmack и Openfire от нашего партнера JCG Харш Равал в блоге harryjoy .