Java Asmack文件发送错误503 Type=使用openfire取消
登录码。登录成功Java Asmack文件发送错误503 Type=使用openfire取消,java,android,asmack,Java,Android,Asmack,登录码。登录成功 String host=AppContext.HOST;//myHost String [] params={"a1","aa"} int port=AppContext.PORT;//My Port 2777 String service=AppContext.SERVICE; //service = smack ConnectionConfiguration connConfig = new
String host=AppContext.HOST;//myHost
String [] params={"a1","aa"}
int port=AppContext.PORT;//My Port 2777
String service=AppContext.SERVICE; //service = smack
ConnectionConfiguration connConfig = new ConnectionConfiguration(
host, port, service);
connConfig.setDebuggerEnabled(true);
Connection.DEBUG_ENABLED = true;
connConfig.setSASLAuthenticationEnabled(true);
XMPPConnection connection = new XMPPConnection(connConfig);
Log.e("XMPP LoginActivity Username ",params[0]+" pass "+params[1]);
try {
connection.connect();
connectionFlg=true;
Log.i("XMPP LoginActivity",
"Connected to " + connection.getHost());
} catch (XMPPException ex) {
Log.e("XMPP LoginActivity", "Failed to connect to "
+ connection.getHost());
Log.e("XMPP LoginActivity", ex.toString());
appContext.setConnection(null);
}
try {
if(connectionFlg)
{
connection.login(params[0], params[1]);
Log.i("XMPP LoginActivity",
"Logged in as " + connection.getUser());
Presence presence = new Presence(Presence.Type.available);
presence.setStatus("I’m available");
connection.sendPacket(presence);
loginFlg=true;
appContext.setConnection(connection);
}else
{
Log.e("XMPP LoginActivity", "Failed to connect to "
+ connection.getHost());
}
} catch (XMPPException ex) {
loginFlg=false; ;
Log.e("XMPP LoginActivity", "Failed to log in as "
+ params[0]);
Log.e("XMPP LoginActivity", ex.toString());
appContext.setConnection(null);
}
我的文件发送代码如下
public void sendFile(String sentTo) {
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());
FileTransferManager manager = new FileTransferManager(connection);
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(sentTo);
File file = new File(Environment.getExternalStorageDirectory()
.getPath() + "/user.json");
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");
}
}
发送时,我得到以下两个xml响应。请看一看
(一)
12:55:16下午发送(1092826504):测试_filehttp://jabber.org/protocol/bytestreamshttp://jabber.org/protocol/ibb
(二)
12:55:16 PM RCV(1092826504):测试_filehttp://jabber.org/protocol/bytestreamshttp://jabber.org/protocol/ibb
请朋友们帮忙。我试过很多代码片段。因为我只做了三天:(我也有同样的问题,我调查了这一节,并以这种方式解决了它 许多人使用“/Smack”或“/Resource”作为jid中的资源部分,但也可以通过另一种方式进行配置 资源路径随着用户的每个状态更改而更改。假设我们要将图像发送到此用户: ”user1@mydomain“ 您必须将“/Resource”部分添加到此jid,它将变成: user1@mydomain/资源 但是/Resource路径会随着状态的变化而变化,所以您必须遵循每个状态的变化来更新资源路径。 最好的方法是在花名册侦听器中获取用户状态,并在presenceChanged()方法中获取最后一个用户资源部分,如下所示:
Roster roster=getRoster();
roster.addRosterListener(new RosterListener() {
@Override
public void entriesAdded(Collection<Jid> addresses) {
Log.d("entriesAdded", "ug");
context.sendBroadcast(new Intent("ENTRIES_ADDED"));
}
@Override
public void entriesUpdated(Collection<Jid> addresses) {
Log.d("entriesUpdated", "ug");
}
@Override
public void entriesDeleted(Collection<Jid> addresses) {
Log.d("entriesDeleted", "ug");
}
@Override
public void presenceChanged(Presence presence) {
Log.d("presenceChanged", "ug");
//Resource from presence
String resource = presence.getFrom().getResourceOrEmpty().toString();
//Update resource part for user in DB or preferences
//...
}
});
}
EntityFullJid jid = JidCreate.entityFullFrom("user1@mydomain/6u1613j3kv");
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid)
transfer.sendFile(new File("DirectoryPath"), "Description");
这意味着您必须按如下方式创建传出转账:
Roster roster=getRoster();
roster.addRosterListener(new RosterListener() {
@Override
public void entriesAdded(Collection<Jid> addresses) {
Log.d("entriesAdded", "ug");
context.sendBroadcast(new Intent("ENTRIES_ADDED"));
}
@Override
public void entriesUpdated(Collection<Jid> addresses) {
Log.d("entriesUpdated", "ug");
}
@Override
public void entriesDeleted(Collection<Jid> addresses) {
Log.d("entriesDeleted", "ug");
}
@Override
public void presenceChanged(Presence presence) {
Log.d("presenceChanged", "ug");
//Resource from presence
String resource = presence.getFrom().getResourceOrEmpty().toString();
//Update resource part for user in DB or preferences
//...
}
});
}
EntityFullJid jid = JidCreate.entityFullFrom("user1@mydomain/6u1613j3kv");
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid)
transfer.sendFile(new File("DirectoryPath"), "Description");
这就是我在smack和Openfire上解决文件传输问题的方法
在您的案例中,sendFile(String sentTo)
functionsentTo
中的表单必须像my jid一样形成,其资源路径随着每次rppresence更改而改变
另外,您必须在Openfire服务器中添加以下属性:
xmpp.proxy.enabled - true
xmpp.proxy.externalip - MY_IP_ADDRESS
xmpp.proxy.port - 7777
我要说的是,我使用的是Openfire 4.0.2和Smack 4.2.2
这也可以通过简单的方式进行配置,只需打开资源即可
XMPPTCPConnectionConfiguration.Builder
像
请澄清您的问题-应该发生什么,发生了什么?我在发送文件时遇到503错误。请参阅第二个xml,因为他们的is 503错误代码和服务不可用。这是主要问题:(由于他们的服务返回503,这方面的主要责任在于接收者,此时您不太可能采取任何措施来解决此问题。嘿,在OpenFire Server属性中要做什么设置,以便接收者可以接收文件。
xmpp.proxy.enabled - true
xmpp.proxy.externalip - MY_IP_ADDRESS
xmpp.proxy.port - 7777
XMPPTCPConnectionConfiguration.Builder configurationBuilder =
XMPPTCPConnectionConfiguration.builder();
configurationBuilder.setResource("yourResourceName");